猎头嘴上说45万年薪,听着像是给人续命,真到签字才发现,里面还塞了“部分股权激励”,而且两年后才可能兑现。好家伙,这不叫45万,这叫“先画饼,再分期”。

评论区有人说,猎头这套话术早都玩熟了,先把你约出来再说。也有人吐槽,大厂出来的人最怕这个,上一家刚挨完锤,下一家又拿期权当安慰奖。说白了,现金和股权压根不是一个东西,HR心里门儿清,候选人着急上岸的时候最容易被糊弄。
这事看着像合同细节,其实就是拿信息差狠狠干你一把。都被降薪了,还指望你赌两年后的股权,HR看完估计自己都不信。
颠倒二进制位
这个题看着像位运算入门,真到代码里,很多人第一下还是会写歪。最常见的歪法,是先把整数转成二进制字符串,翻转,再转回来。能不能做?能。面试官一般也不会当场把你轰出去。但这种写法我第一眼就不太信,问题明明是“位”,你绕到字符串那边去了,味儿就不对了。这个题考的其实就一件事:你会不会按位取、按位放,顺手把移位的坑避开。整体写法上,也更像线上处理二进制标记位,而不是在那儿摆弄字符串。
颠倒二进制位(Reverse Bits)是一道经典的算法题,意思是把一个32位整数的二进制位前后倒过来。比如最低位挪到最高位,次低位挪到次高位,依次处理完32次。
这类题我一般先盯住两个动作:一个是怎么拿到当前最低位,另一个是怎么把这个位塞进结果里。
拿最低位很简单:int bit = n & 1;
这个 & 1 很硬,最低位是1就拿到1,不是就拿到0。
然后把结果左移一位,腾个位置出来,再把刚才这个 bit 塞进去:
result = (result << 1) | bit;
接着原数字继续右移,处理下一位。在 Java 中,我更倾向用无符号右移 >>>,别拿 >> 去赌符号位。负数一旦补符号位,很多人调半天才发现是自己移错了。
直接看完整代码:
public class ReverseBitsSolution {
public int reverseBits(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result <<= 1;
result |= (n & 1);
n >>>= 1;
}
return result;
}
public static void main(String[] args) {
ReverseBitsSolution s = new ReverseBitsSolution();
int n = 43261596;
int ans = s.reverseBits(n);
System.out.println(ans);
}
}
这段代码没什么花活,但路子是正的。每一轮都干三件事:先给 result 左移一位;再把 n 的最低位拼进去;最后把 n 无符号右移,继续取下一位。
为什么一定循环32次?因为题目默认就是32位整数,不管前面是不是一堆0,都得老老实实翻完。你少翻一次,结果就不对。
再拿一个小例子过一下。假设某一刻 n 的最低位是1,那 n & 1 得到1,result 左移后末尾补0,再和1做或运算,最后一位就成了1。要是最低位是0,拼进去的自然就是0。整个过程其实像在不断“出栈、压栈”,只不过栈顶是二进制最低位。
这题不难,坑点主要就两个。
第一个,别用 >> 处理负数。第二个,别想着偷懒按有效位循环,题目要的是完整32位翻转,不是翻到最高的1就停。
面试 时这个题通常不是为了难住你,而是看你写位运算是不是干净。代码短,思路直,移位别写错,基本就够了。