⚠️ 计数减到 0 时为什么要删掉这个键

用字典记窗口里各元素的次数,某个元素减到 0 时应该把键删掉,因为【0】。

开始练习 →

⚠️ 不删键会数出几种

字符串 abcabcbb,窗口长 3 一路滑到末尾。这个版本减到 0 也不删键。运行它: cnt = {} s = "abcabcbb" k = 3 for i in range(k): cnt[s[i]] =

开始练习 →

删了键之后呢

同样的滑动,这次减到 0 就把键删掉。运行它: def add(cnt, ch): cnt[ch] = cnt.get(ch, 0) + 1 def remove(cnt, ch): cnt[ch] -= 1 if

开始练习 →

写一对 add / remove

补全 add 和 remove:remove 减到 0 时要把键删掉。 滑完之后输出窗口里有几种字符。

开始练习 →

⚠️ 删键和不删键,一次对比

把"删键"和"不删键"两个版本都跑一遍,把两个种类数拼起来输出(不删的在前)。 ——这一个字符的差别,在真实题目里就是答案对不对。

开始练习 →

数出窗口里出现最多的字符出现几次

补全代码:窗口长 3 滑到末尾,输出最后那个窗口里出现最多的字符出现了几次。

开始练习 →

找出所有字符都不同的那些窗口有几个

窗口长 3 滑一遍,数出有几个窗口里三个字符互不相同。 (互不相同等价于 len(cnt) == 3——所以上一节那个 del 在这里是决定性的。)

开始练习 →

看到一个双循环,先问什么

想把一个双循环优化掉,先要问【0】。

开始练习 →

优化完之后必须做的一件事

把暴力法优化成 O(n) 之后,必须做的是【0】。

开始练习 →

三个结果都对得上吗

运行下面这段程序: def two_sum(a, target): lo = 0 hi = len(a) - 1 while lo < hi: s = a[lo] + a[hi]

开始练习 →