作为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。嗯,就这么个事,我先去倒杯水,刚那炒饭有点噎人。