Tech Interview Handbook 五周 50 题算法练习计划:Blind 75 作者的 Best Practice Questions 全解
本文为 Tech Interview Handbook(技术面试手册)仓库中「Best practice questions」文档的完整展开。它给出了 Blind 75 作者(即本手册作者)精选的 50 道算法题、按 5 周排布的练习计划与各周考察重心,并结合仓库源码说明这份题单在 Docusaurus 网站中的数据结构、渲染方式及其与 12 周学习计划、Grind 75 工具的衔接关系。读完本文,你将获得一份可直接执行的算法刷题日程,以及按主题查阅算法速查表和进阶资料的完整路径。
为什么只刷"精选"的题
LeetCode 上有一千多道题,盲目全刷对时间紧张的工程师并不现实。本手册作者在多年前从自己的 freeCodeCamp 文章中提炼出最重要的 75 题并在社区分享,这份列表后来在编码面试圈爆红,被大家命名为 Blind 75——作者本人就是用这份列表完成了自己上一次求职,只做了"重要的题"。
在 Blind 75 流传多年之后,作者又将其进一步蒸馏为 50 题,并排布为一份 5 周复习练习计划(源文档:best-practice-questions.md)。作者的核心观点是:大多数 LeetCode 题目都是这几十道核心题中各种技术点的组合,因此先把这些"母题"吃透,再遇到变体题时才能举一反三。
作者在原文中给出的练习原则值得单独强调:
- 像真实面试一样对待每一题:提交前彻底检查代码,而不是只跑通样例;
- 手动构造测试用例:自己编造若干输入(包括边界输入)在脑中或纸上推演一遍,验证正确性;
- 进度追踪:作者为除 Premium 题外的题目建了一份 LeetCode 列表用于跟踪进度;仓库同时提供了可自行定制题单的 Grind 75 工具(见后文"题单在仓库中的实现")。
5 周计划总览
5 周的编排遵循"先序列、再数据结构、后动态规划"的难度爬坡逻辑,每周有明确的主题目标:
| 周次 | 主题 | 考察重心 | 必做题数 | 可选题数 |
|---|---|---|---|---|
| 第 1 周 | Sequences(序列) | 数组与字符串,易中混合热身,打牢基本功 | 10 | 2 |
| 第 2 周 | Data structures(数据结构) | 链表、字符串、矩阵;滑动窗口、链表/矩阵遍历等惯用套路 | 11 | 0 |
| 第 3 周 | Non-linear data structures(非线性数据结构) | 树、图、堆;各种树遍历(前/中/后序)与 BFS/DFS | 9 | 4 |
| 第 4 周 | More data structures(更多数据结构) | 在前 3 周基础上提升难度;堆、Trie 等较少见但仍会被问到的结构 | 10 | 5 |
| 第 5 周 | Dynamic programming(动态规划) | 记忆化(memoization)与回溯(backtracking);ROI 较低,时间充裕者再做 | 10 | 0 |
说明:原表格中的 LeetCode 题面链接均为站外地址,本文按规范省略链接列;只需按题名在 LeetCode 中搜索即可找到对应题目。标注 (Premium) 的题目为 LeetCode 付费题,作者公开维护的 LeetCode 列表未包含它们。
第 1 周 - 序列:数组与字符串热身
第 1 周用数组和字符串的 Easy/Medium 题热身。作者指出:数组和字符串是面试中出现频率最高的题型类别,熟悉它们能帮助你建立扎实的基本功,从而更好处理更难的题目。
必做(10 题)
| 题目 | 难度 |
|---|---|
| Two Sum(两数之和) | Easy |
| Contains Duplicate(含重复项) | Easy |
| Best Time to Buy and Sell Stock(买卖股票的最佳时机) | Easy |
| Valid Anagram(有效的字母异位词) | Easy |
| Valid Parentheses(有效的括号) | Easy |
| Maximum Subarray(最大子数组和) | Easy |
| Product of Array Except Self(除自身以外数组的乘积) | Medium |
| 3Sum(三数之和) | Medium |
| Merge Intervals(合并区间) | Medium |
| Group Anagrams(字母异位词分组) | Medium |
可选(2 题)
| 题目 | 难度 |
|---|---|
| Maximum Product Subarray(最大乘积子数组) | Medium |
| Search in Rotated Sorted Array(搜索旋转排序数组) | Medium |
从题面构成看,这一周覆盖了哈希表(Two Sum、Contains Duplicate)、滑动窗口(Maximum Subarray 的 Kadane 思路、3Sum 的双指针)、区间排序(Merge Intervals)等后续周次会反复用到的核心套路,"热身"实为铺垫。
第 2 周 - 数据结构:链表、字符串与矩阵
第 2 周聚焦链表、字符串和基于矩阵的题目。目标是掌握处理链表的常见操作、矩阵遍历,以及序列分析(数组/字符串)技术——尤其是滑动窗口、链表遍历和矩阵遍历。
必做(11 题)
| 题目 | 难度 |
|---|---|
| Reverse a Linked List(反转链表) | Easy |
| Detect Cycle in a Linked List(环形链表) | Easy |
| Container With Most Water(盛最多水的容器) | Medium |
| Find Minimum in Rotated Sorted Array(寻找旋转排序数组中的最小值) | Medium |
| Longest Repeating Character Replacement(替换后的最长重复字符) | Medium |
| Longest Substring Without Repeating Characters(无重复字符的最长子串) | Medium |
| Number of Islands(岛屿数量) | Medium |
| Remove Nth Node From End Of List(移除链表倒数第 N 个节点) | Medium |
| Palindromic Substrings(回文子串) | Medium |
| Pacific Atlantic Water Flow(太平洋大西洋水流问题) | Medium |
| Minimum Window Substring(最小窗口子串) | Hard |
这一周出现了全计划中的第一道 Hard 题(Minimum Window Substring),它是滑动窗口套路的"完全体",与前面的 Longest Repeating Character Replacement、Longest Substring Without Repeating Characters 构成同一模式的难度阶梯;而 Number of Islands 与 Pacific Atlantic Water Flow 则是矩阵上 DFS/BFS 的两道典型题,直接为第 3 周的图论内容做铺垫。
第 3 周 - 非线性数据结构:树、图与堆
第 3 周聚焦树、图、堆等非线性数据结构。作者要求你熟悉各种树遍历(中序、前序、后序)算法以及图遍历算法(BFS 广度优先搜索、DFS 深度优先搜索),并给出一条经验判断:在实际面试中使用更高级的图算法(Dijkstra、Floyd-Warshall)相当罕见,通常没有必要——把 BFS/DFS 和拓扑排序练熟即可。
必做(9 题)
| 题目 | 难度 |
|---|---|
| Invert/Flip Binary Tree(翻转二叉树) | Easy |
| Validate Binary Search Tree(验证二叉搜索树) | Medium |
| Non-overlapping Intervals(无重叠区间) | Medium |
| Construct Binary Tree from Preorder and Inorder Traversal(从前序与中序遍历序列构造二叉树) | Medium |
| Top K Frequent Elements(前 K 个高频元素) | Medium |
| Clone Graph(克隆图) | Medium |
| Course Schedule(课程表) | Medium |
| Serialize and Deserialize Binary Tree(序列化与反序列化二叉树) | Hard |
| Binary Tree Maximum Path Sum(二叉树中的最大路径和) | Hard |
可选(4 题)
| 题目 | 难度 |
|---|---|
| Maximum Depth of Binary Tree(二叉树的最大深度) | Easy |
| Same Tree(相同的树) | Easy |
| Binary Tree Level Order Traversal(二叉树层序遍历) | Medium |
| Encode and Decode Strings(字符串的编码与解码) | Medium(Premium) |
Course Schedule(课程表)是拓扑排序的代表题,Clone Graph 考查图的 DFS/BFS + 哈希表去重,两者与仓库中 Grind 75 数据里 topo-sort、depth-first-search、breadth-first-search 等 routines 标签直接对应(见下文"题单在仓库中的实现")。
第 4 周 - 更多数据结构:难度爬坡
第 4 周在前几周知识基础上提升题目难度——作者提醒,面试中大概率会遇到这个量级的题目。你会更多接触到**堆(heap)和Trie(前缀树)**这些出现频率较低、但依然会被问到的数据结构。
必做(10 题)
| 题目 | 难度 |
|---|---|
| Subtree of Another Tree(另一棵树的子树) | Easy |
| Lowest Common Ancestor of BST(二叉搜索树的最近公共祖先) | Easy |
| Implement Trie (Prefix Tree)(实现前缀树) | Medium |
| Add and Search Word(添加与搜索单词) | Medium |
| Kth Smallest Element in a BST(二叉搜索树中第 K 小的元素) | Medium |
| Merge K Sorted Lists(合并 K 个升序链表) | Hard |
| Find Median from Data Stream(数据流的中位数) | Hard |
| Insert Interval(插入区间) | Medium |
| Longest Consecutive Sequence(最长连续序列) | Medium |
| Word Search II(单词搜索 II) | Hard |
可选(5 题,均为 Premium)
| 题目 | 难度 |
|---|---|
| Meeting Rooms(会议室) | Easy(Premium) |
| Meeting Rooms II(会议室 II) | Medium(Premium) |
| Graph Valid Tree(图的有效树) | Medium(Premium) |
| Number of Connected Components in an Undirected Graph(无向图的连通分量数) | Medium(Premium) |
| Alien Dictionary(外星词典) | Hard(Premium) |
这一周的三题 Hard(Merge K Sorted Lists、Find Median from Data Stream、Word Search II)分别对应堆的两个经典应用(多路归并、对顶堆求中位数)以及 Trie 上的 DFS 组合搜索,正好落实了作者"堆和 Trie 较少见但仍会被问到"的判断。
第 5 周 - 动态规划:低 ROI 但不可避免
第 5 周专攻动态规划(DP)。作者作为面试官给出了坦率的自我评价:他本人并不喜欢 DP 题——它们与实际工程场景关联不大,如果面试中被要求做很难的 DP 题,他"可能拿不到 offer"。但像 Google 这样的公司仍然会问 DP,因此如果你的目标是 Google,DP 不可避免。
作者给出的 DP 备考建议:
- DP 题较难掌握,提升的唯一方法就是——练习;
- 务必熟悉 memoization(记忆化) 与 backtracking(回溯) 两个概念,它们是从递归过渡到 DP 的桥梁;
- 实际来看,投入大量时间钻研 DP 的投资回报率(ROI)很低,因此 DP 属于"次优先/可选"模块:只在你时间宽裕、且希望全面覆盖(尤其是面 Google)时再做。
必做(10 题)
| 题目 | 难度 |
|---|---|
| Climbing Stairs(爬楼梯) | Easy |
| Coin Change(零钱兑换) | Medium |
| Longest Increasing Subsequence(最长递增子序列) | Medium |
| Combination Sum(组合总和 IV) | Medium |
| House Robber(打家劫舍) | Medium |
| House Robber II(打家劫舍 II) | Medium |
| Decode Ways(解码方法) | Medium |
| Unique Paths(不同路径) | Medium |
| Jump Game(跳跃游戏) | Medium |
| Word Break(单词拆分) | Medium |
从题面构成看,这 10 题覆盖了 DP 的几个基本流派:一维递推(Climbing Stairs、House Robber)、状态机/区间 DP(House Robber II 的环形特判、Decode Ways 的解码歧义)、完全背包类(Coin Change、Combination Sum IV)以及网格 DP(Unique Paths)。若希望体系化补强 DP,仓库课程组件中列出了专题课程(见AlgorithmCourses.md,含 "Grokking the Dynamic Programming Patterns for Coding Interviews")。
题单在仓库中的实现:数据、渲染与工具链
理解这份题单是如何在仓库中落地,有助于你验证题单内容、扩展练习或理解 Grind 75 工具的原理。
结构化题库:QuestionGroups.json
5 周计划之外,仓库还维护了一份结构化的 8 周 75 题题库 QuestionGroups.json(Week 1 ~ Week 8),它是 12 周学习计划中第 5~12 周练习部分的数据源。每条题目标题包含以下字段:
| 字段 | 含义 | 示例 |
|---|---|---|
slug / title |
题目 slug 与显示名 | two-sum / Two Sum |
url |
LeetCode 题面地址 | —(站外链接,此处不展示) |
duration |
建议练习时长(分钟) | 15 |
epi |
EPI(程序员面试金书)中的难度分(0~3,null 表示未收录) |
3 |
difficulty |
LeetCode 难度 | Easy / Medium / Hard |
id |
LeetCode 题号 | 1 |
topic |
所属主题 | array、string、graph、heap、trie、dynamic-programming 等 |
routines |
考察的算法套路标签 | hashing、sliding-window、topo-sort、union-find、monotonic-stack 等 |
例如 two-sum 标注为 topic: array、routines: ["hashing"];course-schedule 标注 routines: ["topo-sort"];number-of-islands 标注 ["depth-first-search", "breadth-first-search"]。这套 topic + routines 标签体系与算法速查表的主题划分(Array、String、Graph、Heap、Trie、Interval 等)一一对应,也就是说:5 周题单是"精选子集",QuestionGroups.json 是"全量题库 + 主题/套路元数据",两者共用同一套主题语言。
渲染逻辑:QuestionList.js
QuestionList.js 负责把 JSON 渲染成网页表格:它遍历 Object.entries(QuestionGroups),用 <h4>Week {index + 5}</h4> 把 JSON 中的第 1~8 组映射为学习计划的第 5~12 周(Week 1 组 → 页面第 5 周),每组渲染 Problem / Difficulty / Duration 三列表格;难度文字通过 DifficultyLabel 组件着色(Easy 绿、Medium 橙、Hard 红)。这也解释了为什么 12 周计划文档本身不写死第 5~12 周的题目——它们由数据文件动态生成,改题单只需改 JSON。
Grind 75 工具入口
仓库内还有一个无服务器函数 grind75 catchall(13 行):它把主站 /grind75 路径下的所有请求重写并代理到独立部署的 Grind 75 站点(SOURCE_HOST = 'https://grind75.pages.dev',保留原路径与查询串)。作者说明 Grind 75 是 Blind 75 的"现代版",支持按剩余时间生成计划、按难度和主题过滤、以及自定义题目分组——当你不想照搬本 5 周计划、而要按自己剩余时间(如 1 个月、2 周)裁剪题单时,应以它为准。
与 12 周学习计划的衔接
best-practice-questions.md 在导航上被 sidebars.js 归入 "Beyond the interview" 栏目,且文档头部提示:2022 年 4 月起作者另有一份 12 周学习计划,其课程化内容(含复习 + 练习题)比这份 5 周题单更完整。coding-interview-study-plan.md 的结构与本 5 周题单互补:
- 第 1~4 周(主题学习):按优先级表格复习各主题(如第 1 周 Array/String/Hash Table/Recursion,第 3 周 Tree/Graph/Heap/Trie),每主题给出建议学时(1~4 小时)并链接到对应算法速查表;
- 第 5~12 周(深度练习):由 QuestionGroups.json 渲染出的 75 题清单(即上文所述的 Week 1~8 组);
- 该文档还定义了三种备考策略:广度优先(先过一遍所有主题再综合刷题,约 1 个月时间推荐)、深度优先(逐主题"复习 + 大量刷题",时间紧时推荐)、深度优先转广度(先逐主题突破、最后综合刷题,时间充裕者推荐),作者个人推荐带广度成分的策略,以免学后面忘了前面。
因此这份 5 周题单的定位是:时间少于 3 个月、想快速完成算法刷题时的浓缩版路径;若时间充裕,优先采用 12 周计划。
刷题时的通用检查清单
结合仓库中的算法速查表通用技巧,做上述 50 题时可对照以下检查点(原文档建议"像真实面试一样检查后再提交",这里给出具体检查项):
- 先验证输入:检查空/负/非法类型输入;或与面试官确认可否假设输入合法以节省时间;
- 确认复杂度约束:是否有时间/空间复杂度要求?若算法需反复执行(如服务端场景),考虑预处理输入;
- 警惕 off-by-one 错误:区间题(Merge Intervals、Non-overlapping Intervals、Insert Interval 均在本计划中)尤其容易踩坑;
- 数据类型一致性:在不做隐式类型转换的语言中,检查拼接的
int/str/list类型是否一致; - 自测示例:写完代码后用几组手工输入验证,包括边界输入;
- 数据结构选型:卡住时枚举常见数据结构逐一尝试是否适用——作者称之为"最后的救命稻草";哈希表是算法题中最常用的结构,且可与双向链表组合(如 LRU Cache 的
get/put双 O(1)); - 权衡空间换时间:提速通常靠"换更合适的结构/算法"或"用更多内存",但注意理论下界(如无序数组求最值不可能快于 O(N))。
进阶资源
原文档末尾推荐了结构化的算法课程,仓库组件 AlgorithmCourses.md 与 README.md 中列出的课程一致:
- AlgoMonster:由 Google 工程师开发,数据驱动地教授关键题型模式,含数据结构与算法基础速成内容;
- Grokking the Coding Interview: Patterns for Coding Questions(Design Gurus):从"题目模式"视角扩展本推荐题单,支持 Java/Python/C++/JavaScript 多语言练习与逐步可视化——这与作者"学习并理解模式,而非背答案"的主张一致;
- Master the Coding Interview: Data Structures + Algorithms(Udemy):约 19 小时内容,除编码外覆盖简历、非技术面、谈薪等,采用 JavaScript 演示;
- Grind 75 工具(见 grind75 catchall):按剩余时间自动生成/裁剪题单;
- 各主题速查表:study-cheatsheet.md 按主题给出优先级(Array/String/Sorting/Matrix/Tree/Graph 为 High,Linked List/Queue/Stack/Heap/Trie/Interval 为 Mid,DP/Binary/Math/Geometry 为 Low),每份速查表包含概述、语言库、复杂度表、面试注意事项、corner cases 与推荐练习题——做 5 周题单时按周查阅对应主题的速查表,效率最高。
小结
这份 Best Practice Questions 的价值在于把"刷什么、什么顺序刷、什么时候可以跳过"三个问题一次讲清:第 1 周数组/字符串打底,第 2 周滑动窗口与矩阵遍历,第 3 周树与图的 BFS/DFS,第 4 周堆与 Trie 的难度爬坡,第 5 周 DP 按 ROI 取舍(目标 Google 才必做)。计划数据本身以 QuestionGroups.json 的主题/套路标签为元数据底座,经 QuestionList.js 渲染进 12 周计划,并由 Grind 75 工具支持按剩余时间定制——按题名在 LeetCode 检索、配合各周速查表与上文检查清单,即可把这份题单转化为一份真正可执行的备考方案。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00