Python技术迷

奇怪,为什么今年投简历,没有任何回复?行情已经差成这样了吗

今年投简历这事,真有点把人投麻了。

不是已读不回,是连“已读”都懒得演,像把简历直接扔进黑洞。你说行情差吧,差是真差,但也不只是行情的问题,很多岗压根就不想认真招人,先挂着,凑KPI,顺手看看市场上有没有更便宜更全能的“六边形牛马”。

Image

评论区也挺真实。有人说现在一个岗位几百上千人抢,HR一天看下来,眼睛都快刷出火星子了。还有人更损,说有些公司发职位不是为了招人,是为了告诉老板“你看,我在招”。

我现在看这种事,已经不太往自己能力上怀疑了。很多时候不是你不行,是对面流程烂、预算卡、用人想法还反复横跳。去年还能挑岗位,今年先有面试都算给面子。

投简历这活,越来越像捞瓶子,回不回来,全看水流往哪边飘。

算法题:最小覆盖子串

这题一眼看过去像字符串题,真下手写,最容易死在“窗口收缩”这一步。

很多人一开始会想暴力:枚举所有子串,再判断是不是覆盖了 t。代码不难,复杂度能把人写老。这个题真正要练的,不是哈希表本身,是你能不能把“刚刚满足”和“还能继续缩”这两个状态捏准。

我一般先盯住一件事:窗口里每个字符出现多少次,和 t 里要求的次数比,什么时候算“够了”。够了以后别急着高兴,左边还能不能缩,才是这题值钱的地方。因为最小覆盖子串,不是找到一个能覆盖的窗口就完事,是要把多余的肉削掉,只留下骨头。

先看核心写法,Python 直接上:

from collections import Counter, defaultdict

defmin_window(s: str, t: str) -> str:
    need = Counter(t)
    window = defaultdict(int)

    required = len(need)   # 需要满足多少种字符
    formed = 0# 当前满足了多少种字符

    left = 0
    best_len = float("inf")
    best_start = 0

for right, ch in enumerate(s):
        window[ch] += 1

if ch in need and window[ch] == need[ch]:
            formed += 1

while formed == required:
if right - left + 1 < best_len:
                best_len = right - left + 1
                best_start = left

            drop = s[left]
            window[drop] -= 1
if drop in need and window[drop] < need[drop]:
                formed -= 1
            left += 1

return""if best_len == float("inf") else s[best_start:best_start + best_len]

这段代码看着就几行,坑不少。

第一个坑,不是窗口里包含了 t 的所有字符就行,而是次数也得够。比如 t = "AABC",你窗口里只有一个 A,那不叫覆盖。

第二个坑,formed 统计的是“满足要求的字符种类数”,不是总字符数。这个地方如果写成长度比较,后面窗口收缩时会越来越乱。

拿 s = "ADOBECODEBANC",t = "ABC"``来看,窗口第一次满足时可能是 "ADOBEC"。但这个串明显肥了,左边 A` 一动就不满足,所以先记结果;如果左边是别的废字符,就继续收,能收多狠收多狠,直到再收就断气为止。这就是滑动窗口的味道:右边负责放人进来,左边负责清退冗余。

再补个测试:

print(min_window("ADOBECODEBANC", "ABC"))   # BANC
print(min_window("a", "a"))                 # a
print(min_window("a", "aa"))                # ""

这题时间复杂度是 O(n),因为左右指针整体都只往前走一遍。别看题目挂着“困难”,真把窗口维护顺了,代码其实比很多中等题还干净。

字符串题做到后面,拼的不是技巧多,而是你能不能把状态定义得不别扭。这题就是个典型。窗口一旦定义清楚,剩下就是机械推进。