程序员的悲哀,是什么? 996嫌累,摸鱼觉得没意思,使用开源库觉得没技术含量,自己造轮子又太累,写代码羡慕领导写PPT。。
刚看到个贴子,说的是程序员的悲哀:干活嫌累,摸鱼无聊,写代码嫌没价值,做PPT又怕没技术,体制内嫌平庸,私企又怕不稳定,想转行怕降薪,不转行又焦虑没竞争力。听着真是满满的矛盾和无奈。😮💨
我觉得这事吧,关键在于“眼高手低”和“过度纠结”。很多网友说这是选择困难症,我倒觉得更像是期待过高。职场从来没有完美解法,就像买西瓜,不可能又便宜又甜还不用挑。程序员也一样,你要么享受稳定的体制,要么拥抱私企的高压高回报,要么自己创业,路只能选一条走下去。
网友们的回复里,有人说程序员最惨是“干着最累的活,看着别人升职”,也有人说“核心还是要提升自身价值”。我比较认同后者。说到底,行业环境不会迁就你,能做的就是提升核心竞争力,少内耗,多积累。【备注:文末可领最新资料】
面试题:最多连胜的次数
昨天晚上十一点多,在公司楼下抽烟吹风,我手机里有人问“东哥,最多连胜怎么算啊?面试总爱考那个…”。我眼皮子打架,但手还是不自觉敲了两行,嗯…这个题其实特别生活化:连着赢几把王者、股票连着几天红、接口连着几次成功,都是一回事,对吧。
我先不讲花里胡哨的,你就想有一串结果,赢记成 True 或者 'W',输是 False 或 'L',问你最长那段连续“赢”有多长。思路很土,但是稳:从左往右扫一遍,遇到赢就把当前计数 +1,遇到输就清零,然后顺手维护一个最大值。整条路不回头,O(n) 就过了。别小看这招,线上统计健康检查连续成功次数我也这么干,简单不容易出事,半夜被叫醒也写得出来,哈哈。
代码我直接丢,你们照抄就能跑。哦对,我这人啰嗦两句:输入既支持布尔也支持 'W'/'L' 这种字符串,省得你再转一遍。
defmax_streak(results):
"""
results: 可迭代对象,如 [True, True, False, True] 或 'WWLWWW'
返回:最长连续胜利的长度
"""
defis_win(x):
if isinstance(x, str):
return x.upper() == 'W'
return bool(x)
curr = 0
best = 0
for r in results:
if is_win(r):
curr += 1
if curr > best:
best = curr
else:
curr = 0
return best
# 小测一下
if __name__ == "__main__":
print(max_streak([1, 1, 0, 1, 1, 1, 0, 1])) # 3
print(max_streak("WWLWWWLWW")) # 3
print(max_streak([])) # 0
等等我接个电话…好了回来。有人会追问:真实业务里总有“豁免一次”的需求啊,比如允许翻车 K 次还算连胜(容错连胜),这个就不能用“清零”了。咋整?滑动窗口,名字高大上,其实操作很家常:用两个指针夹住一段区间,区间里最多放 K 个“输”。右指针一路往右扩,输了就把“输的计数”+1;一旦超过 K,就移动左指针把多出来的“输”甩出去。每次扩完更新一下区间长度的最大值,还是 O(n)。这招我在接口重试统计里用得飞起。
defmax_streak_with_k_losses(results, k):
"""
在允许最多 k 次失利的前提下,最长“有效连胜”长度
results: 如 'WWLWLWL' 或 [True, False, True, ...]
k: int,容错失利次数
"""
defis_win(x):
if isinstance(x, str):
return x.upper() == 'W'
return bool(x)
# 为了统一处理,先转成 1/0
arr = [1if is_win(x) else0for x in results]
left = 0
loses = 0
best = 0
for right, v in enumerate(arr):
if v == 0:
loses += 1
while loses > k:
if arr[left] == 0:
loses -= 1
left += 1
# 此时窗口 [left, right] 内最多 k 次输,长度就是候选答案
best = max(best, right - left + 1)
return best
if __name__ == "__main__":
print(max_streak_with_k_losses("WWLWLWL", 1)) # 4
print(max_streak_with_k_losses("LLLWWW", 2)) # 5
细枝末节我也唠两句,省得你们踩坑。第一,空数组直接返回 0,别抛异常,那叫业务不友好。第二,别用 while 每次都去 max() 一个很重的结构,就维护两个 int,CPU 开心你也开心。第三,实时流里来一条算一条也行,max_streak 本身就是在线算法,内存占用 O(1),我在日志消费里直接滚动统计,没必要把全量丢内存。
有人问那可不可以“改造一次输为赢”但只能改连续的一段?这就是 K 固定为 1 的窗口,再顺手记录一下被改的是哪段,返回区间端点就完事儿。再复杂,比如每局有权重、有加时,这就不是今天深夜能讲完的活儿了…我先去泡杯茶醒醒脑,等会儿群里有人艾特我我再回——
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领