阿里某员工年薪140万,女朋友年薪15万,两人收入差近10倍。这位员工开始嫌弃女友收入低,动了换女友的念头~
刚刷到个瓜,说阿里有位年薪140万的程序员,嫌女友15万收入太低,还打算换人。
作为程序员,我第一反应是——哥们你这心态有 bug 啊。
收入差距确实会带来生活方式的差异,但感情如果全靠财务报表来衡量,那和挑选云服务器按带宽计费有啥区别? 网友有人说“门当户对很重要”,我认同部分,但这不该是唯一的 if 判断条件。现实里,很多大牛选配偶看的是价值观和长期兼容性,就像选技术栈,看的是能不能长期维护,而不是一时的性能爆发。
说到底,财富是变量,感情是核心逻辑。把人当项目管理,不如先修修自己的内存管理。感情代码要想跑得稳,不能全靠金钱驱动。【备注:文末可领最新资料】
面试题:环绕字符串中唯一的子字符串
昨晚十一点多,我在小区门口便利店排队买可乐,手机一震,小李问我一个题——“环绕字符串中唯一的子字符串”,我当时脑子里还在想着肥宅水,结果就…哎先说题,别跑神了。
就是有个无限长的环绕串 s = "abcdefghijklmnopqrstuvwxyz" 不停循环接在一起。给你一个字符串 p,问:p 的所有子串里,能在这个环绕串里出现的“不同子串”有多少个。注意是不同的,"ab"算一个,出现多少次都只记一次;另外 z 后面可以接 a,这个拐弯很关键。
我在店门口一边拆吸管一边跟小李说,千万别去枚举全部子串…那个会爆炸。这个题有个小诀窍:我们只关心以每个字母结尾的、在环绕规则里的“最长连续长度”。为啥?因为如果某个字母结尾的最长长度是 L,那长度为 1..L 的以它结尾的子串都有效且互不重复,其它更短的都被包含了。
那怎么扫?顺着 p 从左到右,看当前位置 p[i] 是否是前一个字符 p[i-1] 在环绕里的下一个:也就是 (ord(p[i]) - ord(p[i-1]) + 26) % 26 == 1。是的话就把当前连续长度 cur 加一;不是就断了,cur = 1 重来。然后用一个 best[26] 记每个字母结尾的最大 cur,不断取最大值。最后把 best 全加起来,就是答案。这个结论想一想挺顺:同一个字母结尾,只需要保留“最长”,更短的都被覆盖。
deffindSubstringInWraproundString(p: str) -> int:
ifnot p:
return0
best = [0] * 26# best[c]:以字符 c 结尾的最长有效长度
cur = 0
for i, ch in enumerate(p):
if i > 0and (ord(ch) - ord(p[i-1]) + 26) % 26 == 1:
cur += 1
else:
cur = 1
idx = ord(ch) - ord('a')
# 只在更长时更新,避免重复统计
if cur > best[idx]:
best[idx] = cur
return sum(best)
# 小测一下
if __name__ == "__main__":
print(findSubstringInWraproundString("zab")) # 预期 6: z, a, b, za, ab, zab
print(findSubstringInWraproundString("cac")) # 预期 2: c, a
print(findSubstringInWraproundString("abaab")) # 随手测
就是那个“环绕”的判断,z->a 一定别漏,用取模写法最稳。还有别天真地把所有子串塞集合里去 dedup,O(n^2) 空间和时间,p 长一点直接超。我们这套方法是 O(n) 时间、O(1) 额外空间(就 26 位数组),很省心。
有人在群里问我“是不是漏了什么更短但不连续的?”不会的。因为我们只承认环绕连续的子串,若以 x 结尾的最长连续是 L,那长度小于 L 的同样连续子串都能截在尾巴上得到;而更短但不连续的,本来就不合法。所以把每个结尾的“最长”加起来,正好把所有合法的不重复子串都数到了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领