Python技术迷

上月绩效出来被气到了,我扛了最难的项目,连续三个月没休过周末,结果绩效被打了最低档,那个和领导走得近天天摸鱼的反而是优。

刚刷到个贴子,说有人上个月绩效气炸了:最难的项目是他扛的,连续三个月没休过周末,结果被打了最低档;反而那个天天摸鱼、跟领导走得近的,成了优秀。

Image

作为程序员,我真是共情满满。这事吧,在技术圈里太常见了。写代码加班到秃头,结果绩效考核看的不是你解决了多少 bug,而是你有没有在群里“活跃”、有没有和领导保持“同步”。网友们有的说认命,有的让他跳槽。我觉得两头都对,但关键还是要看清规则。

职场不是算法题,努力 O(n²) 并不等于结果就比 O(1) 好。价值往往不是纯粹的技术贡献,还有“让领导安心”的那份存在感。说到底,代码写得再漂亮,也得有人看得见才行。

我的看法是:别把绩效当唯一标准,把项目经历当成升级打怪的经验值。能走就走,不能走就修炼自己“会干 + 会说”的双技能。【备注:文末可领最新资料】

面试题:检查替换后的词是否有效

昨晚十一点多我在客厅边喝水边刷题,手机震了一下,小李问我:哥,这个“检查替换后的词是否有效”到底咋判?我一愣,就是那个…把字符串里反复出现的 "abc" 当作一块,能删就删,最后看是不是空串,对吧。思路其实很生活化:像剥洋葱,哪儿冒出一层“abc”就顺手抠掉,能抠到只剩皮,那就有效。

直觉思路:模拟“消消乐”

别想着一次性全局替换,多半会漏。更稳的是用“栈”当垃圾桶。每来一个字符就压进去,一旦栈顶凑成 a b c 这三个连续的,就弹掉它们,相当于做了一次替换。因为替换只影响局部,栈法天然保证顺序和局部性,直到把能消的都消完。最后栈空就说明整个串可以完全由若干个 "abc" 拼出来;不空那就是混了别的料。

defis_valid_after_subs(s: str) -> bool:
    stack = []
for ch in s:
        stack.append(ch)
if len(stack) >= 3and stack[-3:] == ['a', 'b', 'c']:
# 匹配到一次“abc”,弹出相当于完成一次替换
            stack.pop(); stack.pop(); stack.pop()
returnnot stack

# 小试几把
if __name__ == "__main__":
    tests = [
        ("abc", True),
        ("aabcbc", True),      # a + abc + bc -> a + abc + abc -> 空
        ("abcabcababcc", True),
        ("abccba", False),
        ("cababc", False),
    ]
for s, ans in tests:
        print(s, is_valid_after_subs(s), "expect:", ans)

为啥靠谱,复杂度又是多少

你可能会问,这样会不会漏掉跨越边界的匹配?不会。因为一旦形成 "abc" 就立刻被弹走,栈顶永远保持“未消化的尾巴”。新的字符只需要和这段尾巴拼成三连就行。每个字符最多进栈一次、出栈一次,时间复杂度是 O(n),空间最坏 O(n),但在能大量消掉的场景下通常很低。

有同学用 while "abc" in s: s = s.replace("abc", "") 也能过一部分例子,但字符串反复创建,长串时性能直接爆红,而且极端构造会把你卡住。还有一个小细节,判断栈顶三元用切片 stack[-3:] 足够直观,别整什么花活儿,不值当。哦对了,如果题目变成“可替换块不是固定的abc”,比如多种模式,那就把栈顶匹配逻辑做成可配置的;今天这个题,老老实实三连就好。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领