35岁大厂程序员上岸体制内,收入从百万年薪锐减到十几万后,妻子嫌弃他没上进心
刚看到个贴子,说一位35岁的大厂程序员,年薪百万干了8年,最后考上公务员,收入掉到十几万,自己觉得轻松又稳定,但妻子却嫌弃他没上进心。
我觉得这其实是两种价值观的碰撞:一个追求稳定,一个更在意金钱和“上进”的外在标签。大厂的钱确实多,但代价是透支健康和生活;体制内收入少,但时间和心态能真正属于自己。网友有人说“换谁都舍不得百万”,也有人赞同“命比钱重要”,我个人更认同后者。毕竟,钱是手段,不是目的。
说到底还是家庭要达成共识,不然一方图安稳,一方嫌落魄,矛盾迟早爆发。换个角度想,生活就像一桌饭菜,有人要大鱼大肉,有人要清粥小菜,关键是能不能坐在同一张桌子上吃得安心。【备注:文末可领最新资料】
面试题:两数相除
我昨晚正好在地铁上刷题的时候碰到这道“两数相除”的题目,说实话第一眼看过去觉得挺简单的,不就是个除法嘛,用 / 不就完了。但题目要求是不能用乘、除和取模运算符,这一下子就变得有点意思了,得靠位运算和逻辑来模拟。
先说下核心思路吧。我们都知道除法其实就是看被除数里能减去多少个除数,比如 43 除以 5,就是看 43 里能减多少次 5。但如果一下一下减的话,时间复杂度就太高了,特别是数很大的时候。这时候就得想办法加速——用位运算翻倍。就像小孩算乘法那样,不停地把除数往左移(相当于乘 2),找到它能在被除数里放几次。
代码大概是这样写的:
defdivide(dividend: int, divisor: int) -> int:
# 处理边界:防止溢出
INT_MAX = 2**31 - 1
INT_MIN = -2**31
if dividend == INT_MIN and divisor == -1:
return INT_MAX
# 判断结果符号
negative = (dividend < 0) ^ (divisor < 0)
dividend, divisor = abs(dividend), abs(divisor)
result = 0
# 不断减去倍数
while dividend >= divisor:
temp, multiple = divisor, 1
while dividend >= (temp << 1):
temp <<= 1
multiple <<= 1
dividend -= temp
result += multiple
return -result if negative else result
这里的关键就是那个 temp <<= 1,它相当于让除数翻倍。这样可以快速逼近被除数,效率比一下一下减高得多,复杂度大概是 O(logN)。另外要注意溢出的情况,比如 -2^31 / -1 会超出 32 位整型范围,所以需要特判。
我记得我第一次写的时候踩过一个坑,就是忘了用异或来判断结果正负,一开始还傻乎乎地写了很多 if else,代码又长又丑。后来改成 (a < 0) ^ (b < 0),一下子清爽了。
其实这题考的不是你会不会算除法,而是让你用基本操作去模拟,看你能不能把复杂问题拆成简单的位移和减法。写顺了之后挺有成就感的。
说到这我想到一个小细节,测试的时候一定要覆盖几个场景,比如:
被除数比除数小,结果应该是 0 被除数等于除数,结果是 1 负数和正数的组合 特殊的边界 -2^31和2^31-1
这些都过了,基本就稳了。
好了,我得去泡杯咖啡,不然脑子要转不动了。你要不要我再帮你写个更直观的“暴力版”代码,对比一下为什么优化是必要的?
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领