Python技术迷

我一年140万 女朋友一年15万 差了快10倍了 要不要换一个?感觉差距会越来越大 还没结婚 越看越不顺眼了 谈了才两年

刚看到个贴子:男生一年140万,女朋友一年15万,差了快10倍,谈了两年还没结婚,他说越看越不顺眼,纠结要不要换人。

Image

网友回帖有的劝分:“价值观不一样早点散。”也有人说:“你嫌弃她,就别耽误人家。”还有人站男生,觉得收入差距会拖累以后生活。

我觉得这事吧,关键不是差多少钱,而是你怎么看这个人。钱只是结果,性格、责任感、三观、一起扛事的能力,这些才是过日子的底。你现在“越看越不顺眼”,说明问题已经不在工资,而是在尊重和欣赏早没了。

换个角度想,如果一个人因为你挣得少就想换,你愿不愿意跟这种人走一辈子?总的来说,感情可以谈钱,但别只剩钱。

算法题:整数反转

昨天晚上十一点多,我在公司楼下抽烟,冻得直哆嗦,我们组那个小李突然冲下来,一脸崩溃:“哥,面试又被一个整数反转干趴了,你给我讲讲呗…”

我当时整个人还半困状态,就边搓手取暖边跟他说:“这个题啊,说白了就一句话:给你一个 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

这里就两个动作一直循环:

  1. pop = x % 10 取最后一位
  2. 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