上午面试完了,下午给候选人发offer,晚上就被拒了,原因是部门负责人的朋友圈全是凌晨下班的小作文
刚看到个贴子,说上午刚面完候选人,下午火速发了 offer,结果晚上就被拒了。理由居然是部门负责人的朋友圈全是凌晨下班的鸡汤小作文。
作为程序员,我第一反应是:候选人不是拒绝了工作,而是拒绝了“加班文化”。现在大家对互联网那种“凌晨还在敲代码”的状态太敏感了,朋友圈就是一面镜子,能直接反射出团队氛围。候选人没进公司,却已经通过朋友圈看到了未来的自己,这种预判我觉得挺理性。
网友有的说候选人太矫情,但我倒觉得,这是信息透明化后的正常选择。就像写代码前先看文档,能避坑当然要避坑。对公司来说,这说明再高薪也留不住人,如果文化和节奏让人望而却步。
从我的角度看,这事反映了一个趋势:求职已经不只是看薪资,而是看“性价比”——钱和生活能不能匹配。工作再忙,至少别把加班当成荣誉。【备注:文末可领最新资料】
算法题:阶乘生成器
昨天晚上十一点多,在公司楼下吹风,小李跟我叨叨:哥,面试让写个“阶乘生成器”,我一激动把 0! 都写错了…我说别慌,咱就按平时写工具类那种思路来,稳一点就行。
阶乘你们知道吧,n! 就是 1×2×…×n,0!=1,这俩边界记牢先。生成器的点在“持续产出”:你每 next 一次,就给你下一个阶乘。递归能做,但栈会顶不住;循环累乘更省心。而且 long 很快就炸了,20! 就超,所以直接上 BigInteger,图省事。
就是那个…我写个可迭代的,随取随算,线程里单人用最省心:
import java.math.BigInteger;
import java.util.Iterator;
publicclassFactorialGeneratorimplementsIterator<BigInteger> {
private BigInteger i = BigInteger.ZERO; // 当前要乘的数
private BigInteger acc = BigInteger.ONE; // 累乘结果,起点是 1
@OverridepublicbooleanhasNext(){ returntrue; } // 理论上无限
@Overridepublic BigInteger next(){
i = i.add(BigInteger.ONE); // 1,2,3,…
acc = acc.multiply(i); // 1!,2!,3!,…
return acc;
}
// 小示例:打印前 10 个阶乘(含 1! 到 10!)
publicstaticvoidmain(String[] args){
FactorialGenerator g = new FactorialGenerator();
for (int k = 0; k < 10; k++) {
System.out.println((k + 1) + "! = " + g.next());
}
}
}
你看没啥玄学:两个状态位,一个是当前乘到第几个(i),一个是累计值(acc)。每次 next 先把 i+1,再乘上去,就出来下一个阶乘了。0! 怎么办?要的话可以先 System.out.println("0! = 1"); 再循环,也可以改个开关从 0! 开始吐值,这个看业务口味。
刚才有人问我那个…溢出的问题,long 别用了,BigInteger 老老实实。还有并发,如果多个线程共用一个生成器,会抢状态,别省这点对象,谁用谁 new。再一个是缓存,有些同学会做个 Map 把算过的存着,这在“随机访问 n!”时挺香;但生成器是顺着来,本身就是累乘,没必要额外记忆。最后,别写成 acc = acc.multiply(i.add(BigInteger.ONE)) 然后再自增 i,这种顺序一乱就越界少乘,多瞅一眼单测。
要“懒序列”的口味,也行,用 Stream 写得更短——呃我就口播一下:Stream.iterate(new Pair(0,1), p->(p.i+1, p.acc*(p.i+1))),再 map 出 acc。不过可读性嘛,见仁见智。还有个小优化是限制上界,比如算到 500! 就停,hasNext() 里判断一下上限,别真无限给业务扔坑。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html