有个Leader年薪40万,最近招了一个刚进厂的新人,月薪24K,别的组不太看好,说他技术一般。Leader却很看重~
我在网上看到个吐槽:一位Leader年薪四十万,最近招了个刚进厂的新人,月薪开到24K。旁边组的人立刻戴上“放大镜”:技术也就那样吧?这价是不是买贵了?
网友们吵翻了。有的说“24K买新人,血压都上来了”,还有人吐槽“写逻辑的人不值钱了吗”。
也有人站Leader:“反应快的人带得动,碰到线上故障能救火。”我觉得这事挺现实:代码写得稳是基本功,脑子转得快是加成。
真到半夜报警响了,能先把问题止住的人,往往比把注释写得像散文的人更香。对新人也好,遇到肯押注的Leader,少走两年弯路,比多背两本八股更顶用。
算法题:数字 1 的个数
昨天晚上我本来想摸鱼的,结果群里有人丢了个算法题给我:数字 1 的个数。我一开始还以为是“二进制里 1 有多少个”那种,差点就 n & (n-1) 走起了……后来一看,哦,是那种经典的:给你一个 n,问 从 1 到 n 这些数里,十进制数字 ‘1’ 一共出现多少次。就这玩意,面试官特别爱问,原因嘛……怎么说呢,就是看你会不会“按位统计”,不让你傻乎乎遍历到 n。
我当时脑子里画面是这样的:比如 n = 13,那就是 1,10,11,12,13 里出现的 1,一共 6 次。你硬循环也行,但 n 一大,直接炸。然后就得用那个“按位看当前位是 1、0、还是大于 1”的套路。
说人话哈:我们拿某一位(个位、十位、百位……)出来看,把 n 分成三段:
high:这位左边的数cur:当前位的数字low:这位右边的数
比如 n=abcde,你在看 c 这一位,那 ab 就是 high,c 就是 cur,de 就是 low。然后每一位对答案贡献多少个 1,分三种情况:
cur == 0:这一位出现 1 的次数 =high * factorcur == 1:次数 =high * factor + (low + 1)cur > 1:次数 =(high + 1) * factor
factor 就是位权:个位 1,十位 10,百位 100…… 这个公式我第一次背的时候也很痛苦,后来我就用“进位”去理解:cur>1 说明这一位从 0 走到 1 的那一段肯定完整走过了,所以 (high+1)*factor;cur==1 就卡在中间,所以多出来 (low+1);cur==0 就没走到 1 那段,只能 high*factor。
来,Python 代码我直接给你一份能跑的,别整花里胡哨的:
defcount_digit_one(n: int) -> int:
if n <= 0:
return0
ans = 0
factor = 1# 当前位权:1, 10, 100...
while factor <= n:
low = n % factor
cur = (n // factor) % 10
high = n // (factor * 10)
if cur == 0:
ans += high * factor
elif cur == 1:
ans += high * factor + (low + 1)
else:
ans += (high + 1) * factor
factor *= 10
return ans
# 随手测几个
if __name__ == "__main__":
tests = [0, 1, 9, 10, 11, 13, 99, 100, 101, 110, 999, 1000, 12345]
for x in tests:
print(x, count_digit_one(x))
我当时写完还顺手拿 13 验了一下,出来 6,心里就踏实了。然后你要是碰到那种面试官还追问“为啥 low 要 +1”,你就说:因为当 cur==1 的时候,右边从 0 到 low 这些组合都能让当前位保持 1,所以是 low+1 种(包含 0 那种情况)。 哎我说真的,这题要是你现场推公式,容易嘴瓢,就记住这个三段式拆分,基本稳。
行了我先不说了,我这边咖啡都凉了…等会儿还有人问“二进制 1 的个数”我再来一套 x &= x-1,哈哈。