程序员老鬼

作为HR,最无奈的状况之一,就是看到精心筛选几轮面试招来的人,入职不到一周就提离职

刷到一位HR的吐槽:人好不容易从一堆简历里捞出来,几轮面试谈到口干舌燥,结果新人入职没几天就说要走。

站在HR角度,真的很崩溃——前期沟通、协调、背书全砸进去,岗位又得重开,业务同事还会顺带怀疑“你们到底会不会招人”。

Image

但我也能理解新人,有的人是入职后才发现工作内容和想象差太多,有的是团队节奏、管理方式不适配,还有的是被更合适的机会截胡。

说到底,离职不是单方面“翻车”,更多是信息不对称。

面试题:2 的幂

有人在群里顺嘴问我:算法题那个“2 的幂”到底咋写最稳,别整那些浮点 log 了,一到线上就抖,真的。我说行,那就用位运算,干净,像你掐网线一样利索。

大概逻辑是这样的哈:如果一个正整数是 2 的幂,它的二进制长得特别规矩——就一个 1,后面全是 0。比如 8 是 1000,16 是 10000。那 n-1 呢?就会把那个 1 右边全变成 1,比如 10000 - 1 = 01111。所以 n & (n-1) 一按位与,就必然变成 0。你看这思路多像排查线上问题:只要特征对上了,一刀下去就知道是不是它。

但有坑啊,别笑,真的有人写完忘了判断 n>0,然后 n=0、负数一堆乱入,测试就开始阴间了。所以一定先卡住“正整数”这条。

我给你一份 Java 的写法,平时刷题、面试、甚至你写业务里判断 buffer size 是不是 2 的幂(比如 ring buffer)都能用,直接抄走:

publicclassPowerOfTwo{

// LeetCode 231: Power of Two
publicstaticbooleanisPowerOfTwo(int n){
// 必须是正数,0 和负数都不是
return n > 0 && ( (n & (n - 1)) == 0 );
    }

// 你要是喜欢“更像 Java 的写法”,也可以这么写
publicstaticbooleanisPowerOfTwoByBitCount(int n){
return n > 0 && Integer.bitCount(n) == 1;
    }

// 简单跑一下
publicstaticvoidmain(String[] args){
int[] tests = {1, 2, 3, 4, 8, 16, 18, 0, -2, 1024, 1023};
for (int x : tests) {
            System.out.println(x + " -> " + isPowerOfTwo(x));
        }
    }
}

你看啊,1024 -> true,1023 -> false,一眼就舒服。然后我一般会顺便提醒一句:别拿 Math.log 去算,浮点那玩意在边界上会出小数误差,今天你机器是对的,换个 JDK 版本或者换个 CPU 指令集,可能就开始“偶现”,你还以为是玄学,实际上是你自己给自己埋雷。

对了,我那天看 1024 切包的事儿,最后也挺像这个判断:边界值一到,之前“看起来都对”的逻辑就开始错位。反正吧,写算法题也一样,别图省事,条件卡严一点,n > 0 这种就别省,省了你后面排查比抓包还痛苦……行了我先不说了,我这会儿又有人 ping 我,说测试环境又卡住了,我去瞄一眼日志先。