⚠️ 用 `lo < hi` 会怎样
下面这段二分把循环条件写成了 lo < hi,在 [13, 15, 17, 23, 24] 里找 24。运行它: def buggy(a, target): lo = 0 hi = len(a) - 1 whi
改成 `lo <= hi` 呢
同一段代码,只把循环条件改成 lo <= hi。运行它: def bfind(a, target): lo = 0 hi = len(a) - 1 while lo <= hi: mid
⚠️ 修一个漏查的二分
下面这段二分用了 while lo < hi,会漏掉最后一格。 把它改对,然后找 24。
⚠️ 修一个会转不出来的二分
下面这段二分忘了更新边界,范围永远不缩小。 模板里放了一个 guard 步数上限,不改的话它会返回 -2(而不是把判题机挂住)。 把两句边界更新补上,然后找 24。
三个边界一起验
写一个正确的二分,然后一次验三条:找 24(最后一格)得 4、找 13(第一格)得 0、找 20(不存在)得 -1。 三条全过输出 边界通过,否则输出 有失败。
前缀搜索用 Trie 比扫全表强在哪
做"以某个前缀开头"的搜索,Trie 比扫一遍全表强在【0】。
有序数组二分能不能做前缀搜索
把词库排好序再二分,做前缀搜索【0】。
以 app 开头的有几个
词库是 apple、app、apply、banana。运行下面这段程序: def build_trie(words): t = {} for w in words: node = t for
app 自己算不算一个词
同一个词库。运行下面这段程序: def build_trie(words): t = {} for w in words: node = t for ch in w:
数出以某个前缀开头的词有几个
补全 count_prefix:先走到前缀那个节点,再递归数出下面有多少个词尾标记。 这次数 app 开头的。