Python技术迷

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

最近看到个HR吐槽:自己像写单元测试一样,简历筛一轮、面试跑几轮,好不容易“merge”进来的新人,入职没几天就说要走。业务同学立马投来“你这需求评审怎么过的”眼神,招聘成本、时间、情绪,全被一键回滚。
我觉得这事儿最扎心的点是,HR背锅像我背线上故障一样,明明问题可能在流程、岗位、预期没对齐。真想少翻车,入职前把工作节奏、考核方式、团队画风聊透,来个三天试跑、双向确认,优势很实在:人少折腾,岗少空窗,大家也少互相怀疑。

算法题: 2 的幂

昨晚我在工位上啃外卖你们懂吧,就那种油都凝了的炒饭,边吃边看线上报警,突然群里有人甩了个算法题:判断一个数是不是 2 的幂。哎这题看着小,真要在业务里用,坑还挺多……比如你拿到的可能是 0,可能是负数,甚至可能是字符串转出来的空值(别笑,我真遇到过,那个接口叫什么来着…哦对就是 API 返回了 "" )。 我当时第一反应是:别搞什么循环除 2 了,写起来也行,但一旦你在热路径里跑,或者你要做批量校验,循环那个分支预测都能把你恶心死。最稳的还是位运算那个老梗: 如果 n 是 2 的幂,那二进制里只有一个 1 ,像 1(1) 2(10) 4(100) 8(1000) 这种。然后 n & (n-1) 会把最低位那个 1 干掉,结果就变成 0。 举个例子: 8(1000) & 7(0111) = 0 ,对吧。 但注意啊,0 和负数也会在某些语言里搞出奇怪结果,所以一定要先 n > 0 ,不然你半夜排查会骂街。 我顺手写了个 Python 版,放这,你们直接抄就行(别抄错,我打字也容易漏括号):
from typing import Union

def is_power_of_two(n: Union[int, str]) -> bool:
    # 线上常见:参数可能是字符串
    if isinstance(n, str):
        n = n.strip()
        ifnot n:
            returnFalse
        # 允许 "+8" 这种,别太较真
        try:
            n = int(n)
        except ValueError:
            returnFalse

    ifnot isinstance(n, int):
        returnFalse

    # 关键:必须是正数
    if n <= 0:
        returnFalse

    # 位运算核心:2 的幂只有一个 1
    return (n & (n - 1)) == 0


# 随手测一下,别到线上再“卧槽怎么全是 False”
if __name__ == "__main__":
    tests = [1, 2, 3, 4, 5, 8, 16, 0, -2, " 64 ", "0", "", "abc", "+32"]
    for x in tests:
        print(x, "=>", is_power_of_two(x))
你要是面试那种题库风格(比如函数签名固定),就更短一点:
class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0
对了我还见过有人用 bin(n).count("1")==1 ,也能过,但说实话那就是把 CPU 当字符串机用,写着爽,跑着慢,日志一多就…算了不展开了。 反正这题就记住一句话:先卡住 n > 0 ,然后 n & (n-1) 是否为 0。嗯,就这么个事,我先去倒杯水,刚那炒饭有点噎人。