为什么体力工作貌似很少有猝死的,脑力工作者却频频有猝死的新闻(程序员,高中教师等)?
你说搬砖的,一天晒得跟碳烤鸡翅似的,汗流浃背,一顿饭下去秒睡,第二天又满血复活;再看看我们这些脑力劳动者,坐着吹空调、喝着美式,结果一个个头发掉得比写Bug的速度还快,轻则失眠焦虑,重则心梗猝死。
我觉得体力劳动虽然累,但“累在身上,解压在床上”;脑力劳动是“不动手,只动脑”,但脑子一动,烦心事就像死循环——下班了还在想:那个接口为啥又超时?产品改需求的时候是不是偷偷抽了我20块的咖啡钱?
有人说程序员坐着挣钱,我说对不起,是坐着耗命。身体没怎么动,心却跳得贼欢。身体吃不了热干面,心脏倒是天天蹦迪。
总结?不总结了,我得去跑个步缓缓。说不定还能捡回一条命。
算法题:最长连续序列
最长连续序列这题,每次刷到我都觉得它不是在考察算法,而是在考察心态。表面上看起来就是“找一个数组中最长的连续数字序列”,比如 [100, 4, 200, 1, 3, 2],答案就是 [1,2,3,4] 长度是 4。但你一不小心就容易写出时间复杂度是 O(n log n) 的解法,比如先排序再扫一遍,面试官一看,直接给你发个“回家等通知”。
我一开始也老是下意识排序,直到哪天通宵写需求,突然灵光一闪——能不能用哈希表试试?Python 的 set() 不就是为这种乱序查找准备的吗?
于是我把数组转成一个 set,这样查找某个数字是不是存在就是 O(1)。然后只从“每个序列的开头”开始往后找,啥叫开头?就是当前数字 num,它的前一个 num - 1 不存在于 set 中时,才开始往后找。
贴个代码你就懂了:
deflongest_consecutive(nums):
num_set = set(nums)
longest = 0
for num in num_set:
if num - 1notin num_set: # 是序列起点
current_num = num
current_streak = 1
while current_num + 1in num_set:
current_num += 1
current_streak += 1
longest = max(longest, current_streak)
return longest
这个解法时间复杂度是 O(n),空间复杂度也是 O(n),适合数组特别大或者在线数据流的场景(只要能装得下内存就行)。而且逻辑贼清晰,既不需要排序也不用额外维护索引。
面试的时候我就靠这题翻盘过,前面两道题写得不咋地,最后这题写完面试官说了句“哈,这代码写得挺舒服”,我当时心想:“老哥你开心就好,能过我也开心。”
不过这题也不是没坑,比如 [1, 2, 0, 1] 这种,1 重复了,如果你傻乎乎用 list 来查找或记录,就容易被卡成 O(n²),所以一开始就转成 set 非常关键。还有不要忘了:判断起点是 if num - 1 not in num_set,否则你会对每个数都跑一次 while,直接炸成 TLE(超时)。
这题其实还有进阶玩法,比如支持插入删除查询序列长度的版本,就得用并查集或者树状结构了,但正常面试考到这儿就收工了,再卷就不是刷题,是面试官在练人性了。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。