我一年140万 女朋友一年15万 差了快10倍了 要不要换一个?感觉差距会越来越大 还没结婚 越看越不顺眼了 谈了才两年
刚看到个贴子:男生一年140万,女朋友一年15万,差了快10倍,谈了两年还没结婚,他说越看越不顺眼,纠结要不要换人。
网友回帖有的劝分:“价值观不一样早点散。”也有人说:“你嫌弃她,就别耽误人家。”还有人站男生,觉得收入差距会拖累以后生活。
我觉得这事吧,关键不是差多少钱,而是你怎么看这个人。钱只是结果,性格、责任感、三观、一起扛事的能力,这些才是过日子的底。你现在“越看越不顺眼”,说明问题已经不在工资,而是在尊重和欣赏早没了。
换个角度想,如果一个人因为你挣得少就想换,你愿不愿意跟这种人走一辈子?总的来说,感情可以谈钱,但别只剩钱。
算法题:整数反转
昨天晚上十一点多,我在公司楼下抽烟,冻得直哆嗦,我们组那个小李突然冲下来,一脸崩溃:“哥,面试又被一个整数反转干趴了,你给我讲讲呗…”
我当时整个人还半困状态,就边搓手取暖边跟他说:“这个题啊,说白了就一句话:给你一个 32 位有符号整数,把它倒过来,能结果就结果,倒完要是超出范围 [-2^31, 2^31-1] 就老老实实返回 0。”
比如: 123 → 321 -123 → -321 120 → 21(前导 0 要干掉)
小李一听:“哎这不就字符串倒一下吗?” 我说对,你这思路没问题,而且在实战里字符串解法完全能用,但是很多面试官更偏爱“纯数学”那一套,所以两个思路都准备一下比较稳。
先说个最偷懒的写法,字符串版的
场景你想象一下:你接口拿到一个 x,咱就先判断正负,转成字符串,切片反转,再转回去。
defreverse_str(x: int) -> int:
# 32 位整型范围
INT_MIN, INT_MAX = -2**31, 2**31 - 1
s = str(x)
# 判断是不是负数
if s[0] == '-':
rev = '-' + s[:0:-1] # 把后面的倒过来,再补个负号
else:
rev = s[::-1]
res = int(rev)
# 判一下溢出
if res < INT_MIN or res > INT_MAX:
return0
return res
这个写法基本一眼就能懂,对吧,也没啥算发难度,就是面试官有时候会嫌你太“字符串程序员”,觉得你没从数字的角度去想问题,没办法,人家出题就爱这一口…
重点还是说下“数学版”的
我就跟小李说:你想象一下有个数 123,咱每次“抠”最后一位出来:
第一次:拿到 3 然后结果 res = 0 * 10 + 3 = 3 第二次:拿到 2,res = 3 * 10 + 2 = 32 第三次:拿到 1,res = 32 * 10 + 1 = 321
这里就两个动作一直循环:
pop = x % 10取最后一位res = res * 10 + pop把它拼到结果后面
再让 x = x // 10 去掉最后一位,直到 x 变成 0。
听起来很简单对不对?结果里面坑还挺多的…
有三个小细节:
1)负数怎么搞? 2)Python 里 // 对负数是向下取整,-123 // 10 = -13,而我们其实想要 -12 那种“朝 0 取整”的效果 3)32 位溢出怎么判?Python 自己不会溢出,要我们手动卡范围
所以我后来习惯这么写:先把符号拆出来,统一按正数做,做完再带符号。
来一份我工作中常用的 Python 版本
defreverse(x: int) -> int:
# 32 位有符号整数范围
INT_MIN, INT_MAX = -2**31, 2**31 - 1
# 先处理符号
sign = -1if x < 0else1
x = abs(x)
res = 0
while x != 0:
# 取最后一位
pop = x % 10
x //= 10
# 关键:拼进去之前先判断会不会溢出
# 如果 res 已经比 INT_MAX // 10 大,再乘 10 肯定超
if res > INT_MAX // 10:
return0
if res == INT_MAX // 10and pop > INT_MAX % 10:
return0
res = res * 10 + pop
res *= sign
# 再保险判一次
if res < INT_MIN or res > INT_MAX:
return0
return res
你看整个逻辑其实就那几步:
把负号拆出来单独记着 一直“抠最后一位 + 拼到结果” 每次拼之前预判一下会不会溢出
面试官一般看到你写出提前判断溢出这块,会觉得你平时刷题不是白刷的,细节还有在看的。
顺便带你脑补一下几个测试用例
print(reverse(123)) # 321
print(reverse(-123)) # -321
print(reverse(120)) # 21
print(reverse(1534236469)) # 溢出,返回 0
最后那个数字,在 32 位范围外了,所以要返回 0,不然面试官会盯着你问“那超范围你打算咋办”,你要是愣住就尴尬了。
我跟小李把这两种写法过了一遍,他当场敲了一遍,跑通了几个例子,整个人立马精神了,说:“行,那下次再让我写整数反转,我就先整这个数学版,再顺嘴提一嘴可以用字符串。”
我说对,思路说明白 + 代码简洁,这题基本就稳了。
行了,我先去冲杯咖啡,等会还有个小需求要改,你要是还想整点别的算法题,一会儿再喊我。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB