听说讯飞有个妹子中了1000万大乐透,奖金都不要了,立马离职走人
“中1000万,奖金都不要了,立马离职走人”据说讯飞这妹子运气好到爆炸。
但我觉的,真中了大乐透,先做的通常不是拍桌子辞职,是核票、兑奖、税务、保密,脑子再热的人,走到这一步也会先把钱落袋。更别说“奖金都不要了”这种说法,听着就像段子。
公司工资再离谱,也很难离谱到一张千万彩票都能随手扔。
这类消息能传起来,靠的就两样:一个是“名企+妹子+暴富”的标签够抓眼球,另一个是大家太爱看“我早就不想干了”的爽文结局。
离职可以是真的,中彩票也可能是真的,但把两件事硬焊成一个戏剧故事,多半就剩下情绪价值了。吃瓜可以,别太当真。
算法题:有效的正方形
四个点看着都差不多,代码一跑就翻车。 这题最容易写歪的地方,不是公式不会推,而是你一上来就想判断斜率、判断平行,最后把自己绕进去。 我做这类几何题,一般先不碰浮点数,先把“边”和“对角线”这件事钉死。
题目叫有效的正方形,给你四个点,问能不能组成正方形。这里有两个坑很常见:
第一,点可能重复。只要有重复点,直接就废了。 第二,别去算边长开根号,纯属给自己找精度问题。平方距离够用了。
正方形本质上就两件事: 4 条边相等,2 条对角线相等。 四个点两两组合,一共 6 个距离。正常情况下,这 6 个距离里只会出现 2 种值:
小的那个值出现 4 次,对应 4 条边 大的那个值出现 2 次,对应 2 条对角线
只要不是这个分布,基本就不是正方形。
代码我一般会这么写,短一点,现场也好排:
import java.util.HashMap;
import java.util.Map;
classSolution{
publicbooleanvalidSquare(int[] p1, int[] p2, int[] p3, int[] p4){
int[] ds = newint[] {
dist(p1, p2), dist(p1, p3), dist(p1, p4),
dist(p2, p3), dist(p2, p4), dist(p3, p4)
};
Map<Integer, Integer> cnt = new HashMap<>();
for (int d : ds) {
if (d == 0) {
returnfalse;
}
cnt.put(d, cnt.getOrDefault(d, 0) + 1);
}
if (cnt.size() != 2) {
returnfalse;
}
boolean has4 = false, has2 = false;
for (int times : cnt.values()) {
if (times == 4) has4 = true;
if (times == 2) has2 = true;
}
return has4 && has2;
}
privateintdist(int[] a, int[] b){
int x = a[0] - b[0];
int y = a[1] - b[1];
return x * x + y * y;
}
}
这写法有个好处,脑子负担小。 不用分情况讨论点的顺序,也不用先排序再猜哪条是边。四个点随便给,最后都落到 6 个距离上。
拿一组正常数据试一下:
p1 = [0, 0]
p2 = [1, 1]
p3 = [1, 0]
p4 = [0, 1]
算出来距离集合就是 1,1,1,1,2,2,这个味道就对了。
反过来,长方形会长成 a,a,b,b,c,c,菱形有时候是 a,a,a,a,d1,d2,对角线还不一样。 所以别看它们长得像,6 个距离一摊开,基本藏不住。
这题不难,难的是别把简单题写复杂。 能用整数距离解决的,别去碰浮点数;能一次性看 6 个结果的,别写一堆几何特判。 写算法题,很多时候不是比谁会的公式多,是比谁先把麻烦绕开。