Python技术迷

程序员的悲哀,是什么? 996嫌累,摸鱼觉得没意思,使用开源库觉得没技术含量,自己造轮子又太累,写代码羡慕领导写PPT。。

刚看到个贴子,说的是程序员的悲哀:干活嫌累,摸鱼无聊,写代码嫌没价值,做PPT又怕没技术,体制内嫌平庸,私企又怕不稳定,想转行怕降薪,不转行又焦虑没竞争力。听着真是满满的矛盾和无奈。😮‍💨

Image

我觉得这事吧,关键在于“眼高手低”和“过度纠结”。很多网友说这是选择困难症,我倒觉得更像是期待过高。职场从来没有完美解法,就像买西瓜,不可能又便宜又甜还不用挑。程序员也一样,你要么享受稳定的体制,要么拥抱私企的高压高回报,要么自己创业,路只能选一条走下去。

网友们的回复里,有人说程序员最惨是“干着最累的活,看着别人升职”,也有人说“核心还是要提升自身价值”。我比较认同后者。说到底,行业环境不会迁就你,能做的就是提升核心竞争力,少内耗,多积累。【备注:文末可领最新资料】

面试题:最多连胜的次数

昨天晚上十一点多,在公司楼下抽烟吹风,我手机里有人问“东哥,最多连胜怎么算啊?面试总爱考那个…”。我眼皮子打架,但手还是不自觉敲了两行,嗯…这个题其实特别生活化:连着赢几把王者、股票连着几天红、接口连着几次成功,都是一回事,对吧。

我先不讲花里胡哨的,你就想有一串结果,赢记成 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 全部免费领