算法与数据结构面试:14 模式 + 300 题系统化训练
0. 元信息
- 主题路径:
docs/topics/career-and-interview/subtopics/coding-interview/README.md - 父主题:
career-and-interview - 适合对象:准备技术面试的工程师;尤其是”刷过 200 题但现场还是不会”的人
- 建议周期:4~6 周
- 前置知识:
algo-design(基本数据结构与算法);至少 1 门编程语言熟练(Python / Java / C++ / Go) - 最终目标:按 14 模式刷完 300 题,其中 Medium ≥ 60%、Hard ≥ 10%;现场拿到一道 Medium 能在 20 分钟内出最优解
1. 学习路线
14 模式识别框架
→ 模式卡建立(每个模式 5~10 题)
→ Blind 75 / NeetCode 150 滚动刷
→ 时间空间复杂度训练
→ 边界用例 + Follow-up 习惯
→ Mock coding interview 录音
每一步都是下一步的前置:没有模式识别就刷题是题海;没有时间复杂度训练就现场写不出最优解。
2. 阶段周数分配
| 阶段 | 4 周方案 | 6 周方案 | 备注 |
|---|---|---|---|
| 1. 14 模式识别框架 | 0.5 | 0.5 | 模式清单 + 分类规则 |
| 2. 模式卡建立(每模式 5~10 题) | 1 | 1.5 | 14 张模式卡(Anki / Markdown) |
| 3. Blind 75 / NeetCode 150 滚动刷 | 1.5 | 2 | 150 题刷题记录 |
| 4. Hard 进阶 + 复杂度训练 | 0.5 | 1 | 50 题复杂度速记 |
| 5. 边界用例 + Mock 综合 | 0.5 | 1 | 5 次 mock + 复盘 |
| 合计 | 4 | 6 |
4 周方案面向有 3 年算法基础 / 目标明确转岗的工程师;6 周方案面向第一次走完整算法路线 / 目标 L5+ 的求职者。综合项目(刷题 record + 模式卡)作为求职 Sprint 的子模块。
3. 核心知识 / 产出 / 标准表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 14 模式识别 | Two Pointers / Sliding Window / Fast Slow / Merge Intervals / Cyclic Sort / In-place Reversal / BFS/DFS / Two Heaps / Subsets / Modified Binary Search / Top K / K-way Merge / DP / Trie | 一张 14 模式清单 + 每模式例题 | 拿到新题 30 秒内能归类 |
| 2. 模式卡建立 | 每模式 5~10 题 + 模板代码 + 复杂度分析 | 14 张模式卡(Markdown / Anki) | 面试前 1 周能 30 秒回忆模板 |
| 3. Blind 75 / NeetCode 150 | 按模式分类刷,每个模式 10~15 题 | 150 题刷题记录 | 每题能独立写出最优解 |
| 4. 时间空间复杂度 | O(1)/O(n)/O(n log n)/O(n²) 训练 + trade-off | 50 题复杂度卡片 | 面试中能边写边分析复杂度 |
| 5. 边界用例 | 空输入 / 单元素 / 全相同 / 极值 / 重复 | 30 题边界用例清单 | 提交前能列举 5 类边界 |
| 6. Mock coding | Pramp / 朋友 / 录音 / 计时 | 5 次 mock 录音 + 复盘 | 现场 20 分钟内完成 Medium |
4. 第一周任务
Day 1 约定:本计划以”14 模式识别 + 模式卡 + 刷题记录 + 边界用例 + mock 复盘”为最小循环。所有产出必须有可见证据(模式卡、题解、复杂度记录、mock 录音)。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 学 14 模式框架(Two Pointers / Sliding Window / Fast Slow / BFS/DFS / DP / …),用 Anki 建模式卡骨架 | 14 模式清单 + Anki 卡 |
| Day 2 | Two Pointers 模式:刷 5 道代表题(Two Sum II / 3Sum / Container With Most Water),每题写模式 + 模板 + 复杂度 | 5 道题解 + 1 张模式卡 |
| Day 3 | Sliding Window 模式:刷 5 道代表题(Longest Substring / Minimum Window Substring),写最小可复用模板 | 5 道题解 + 1 张模式卡 |
| Day 4 | BFS/DFS 模式:刷 5 道代表题(Number of Islands / Word Ladder / Clone Graph),强调队列 / 递归 | 5 道题解 + 1 张模式卡 |
| Day 5 | DP 入门:刷 5 道一维 DP(Climbing Stairs / House Robber / Maximum Subarray),先写状态转移再写代码 | 5 道题解 + 1 张模式卡 |
| Day 6 | 找 1 位朋友 mock:1 道 Medium 编码(限时 20 分钟),录音回放 + 记 3 个改进点(模式识别 / 复杂度 / 边界) | mock 录音 + 反馈清单 |
| Day 7 | 步骤 A:跑通 14 模式清单 + 25 题刷题记录 + 5 张模式卡 + mock 录音;步骤 B:补齐 4 类边界(题解无模式分类 / 不记复杂度 / 边界用例漏 / mock 没录音) | 刷题工具包 v0.1 + 4 类问题清单 |
Day 7 步骤 A 把刷题资产跑通;步骤 B 每类问题先在文档里复现,再讲清补救路径。
5. 阶段通用验收
- 不看答案独立重写 ≥ 60 道刷过的题(每题 ≤ 20 分钟);
- 用自己的话解释每个题属于哪个 14 模式、为什么这样写、复杂度是多少;
- 画一张图:复杂度速记卡(O(1)/O(log n)/O(n)/O(n log n)/O(n²)/O(2^n) + 对应例题);
- 测试 5 类边界用例:空输入 / 单元素 / 全相同 / 极值 / 重复;
- 准备至少 3 组自定义数据并贴出实际输出(手写 + LeetCode 提交记录);
- 记录每个题的时间 / 空间复杂度,能边写边分析 trade-off;
- 能修改已有题解(换模式、加边界、加 follow-up),不是只照抄题解。
6. 最终验收
- 累计完成 300 道算法题(分布:数组/链表 60、树/图 60、DP 50、二分/滑动窗口 50、哈希/堆/Trie 50、其他 30),其中 Medium ≥ 60%、Hard ≥ 10%;
- 完成 14 张模式卡(每模式 5~10 题 + 模板代码 + 复杂度 + 边界 + 可选 follow-up);
- 现场拿到 Medium 题 ≤ 20 分钟出最优解(mock 录音可证),Hard 题能讲清思路;
- 完成 ≥ 50 题的复杂度速记卡(能边写边分析 time/space);
- 完成 5 次 mock coding interview(每场 60 分钟),每次留录音 + 复盘清单;
- 能用 15 分钟讲清自己的刷题路线、模式识别法、复杂度分析习惯、mock 复盘方法。
7. 综合项目
首选:求职 Sprint 的 coding 子模块(必做:14 模式卡 + 300 题刷题记录 + 5 次 mock 录音 + 复杂度速记卡)。
- 输入:编程语言熟练度(Python / Java / C++ / Go 选其一)、目标岗位代码要求;
- 输出:必输出(1)14 张模式卡(Markdown / Anki);(2)300 题刷题记录(题号 + 模式 + 难度 + 用时 + 一次通过率);(3)50 题复杂度速记卡;(4)30 题边界用例清单;(5)5 次 mock 录音 + 复盘;(6)刷题路线图 PDF(按模式与难度可视化);(7)1 份 retrospective;(8)1 份模式卡使用说明;
- 关键指标:Medium 题 20 分钟内出解 ≥ 90%、Hard 题能讲清思路 ≥ 70%、模式卡能 30 秒回忆模板;
- 进阶可选:Codeforces Div2 比赛成绩排名、Anki 间隔重复 4 周后保留率 ≥ 80%、LeetCode contest 评分进入 top 20%。
备选:14 模式精讲笔记(每模式 5 道代表题 + 模板 + 复杂度 + 边界 + 3 道 follow-up),适合”已刷过 100 题想系统化”的求职者。
任何综合项目都必须包含:
- 14 模式清单与识别规则;
- 模式卡(每模式 5~10 题 + 模板代码 + 复杂度 + 边界);
- 刷题记录(300 题,分布可计算);
- 复杂度速记卡(50 题,能边写边分析);
- 边界用例清单(30 题,5 类边界覆盖);
- mock 录音 + 复盘(5 次,每场 60 分钟);
- README(含刷题 window、目标、产出、复盘);
- retrospective.md(含教训、改进、下一轮)。
notes/ 与 README 存放规范
所有”模式卡 / 复杂度卡 / 边界用例 / mock 复盘”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:
notes/pattern-cards.md:14 张模式卡(每张含模式名 + 模板 + 代表题 + 复杂度 + 边界);notes/progress.md:300 题刷题记录(题号 + 模式 + 难度 + 用时 + 一次通过率)+ 按模式分布图(Mermaid);notes/mock-retro.md:5 次 mock 录音链接 + 复盘清单(每场 ≥ 3 个改进点);notes/cheatsheet.md:复杂度速记(O(1)/O(log n)/O(n)/O(n log n)/O(n²)/O(2^n))。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 全部 | 经典书 | Gayle McDowell《Cracking the Coding Interview》 | https://www.crackingthecodinginterview.com/ | 算法 + 行为 + 系统设计三合一 |
| 全部 | 入门 | Aditya Bhargava《Grokking Algorithms》 | https://www.manning.com/books/grokking-algorithms | 算法图解入门 |
| 1 | 路线 | NeetCode Roadmap | https://neetcode.io/roadmap | 14 模式刷题路线 |
| 1 | 综合 | Tech Interview Handbook | https://www.techinterviewhandbook.org/ | 求职综合字典 |
| 2 | 视频 | NeetCode YouTube | https://www.youtube.com/c/NeetCode | 算法视频讲解 |
| 3 | 题库 | LeetCode | https://leetcode.com/ | 主刷题平台 |
| 3 | 题库 | Blind 75 | https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions | 75 题经典入门 |
| 4 | 进阶 | Codeforces | https://codeforces.com/ | 高难度训练 |
| 5 | mock | Pramp | https://www.pramp.com/ | 免费 mock |
| 5 | 间隔 | Anki | https://apps.ankiweb.net/ | 间隔重复模式卡 |
默认使用顺序:先读《Cracking the Coding Interview》前 9 章建立框架 → 按 NeetCode Roadmap 14 模式分类 → 用 LeetCode + Blind 75 / NeetCode 150 刷题 → 看 NeetCode YouTube 视频讲解补卡点 → 用 Anki 间隔重复模式卡 → 用 Pramp 做 5 次 mock → 写复盘到
notes/mock-retro.md。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
算法面试是技术面试的入口关。1990 年代 Microsoft 引入标准化算法面试;2007 年 Steve Yegge 让刷题文化扩散;2016 年《Cracking the Coding Interview》第 6 版成为事实标准;2020 年后 NeetCode 用 14 模式重塑了刷题路线。今天每一个目标 L5/L6 级别工程师都按模式刷 200~400 题。算法面试不是智力测试,是模式识别 + 工程化训练。
9.2 概念地图
flowchart LR
Pattern[14 模式] --> Template[模板代码]
Template --> Blind[Blind 75]
Blind --> NC150[NeetCode 150]
NC150 --> Hard[Hard 进阶]
Hard --> Mock[Mock 录音]
Pattern -.识别.-> Question[新题]
Template -.套用.-> Question
Question --> Complexity[复杂度分析]
Complexity --> Boundary[边界用例]
Boundary --> Answer[最优解]
关系说明:模式是索引,模板是工具,题库是训练集,复杂度是评价,边界是质量,mock 是综合检验。
9.3 基础知识讲解
9.3.1 14 模式 + 代表题
| 模式 | 代表题 | 关键思路 |
|---|---|---|
| Two Pointers | Two Sum II、3Sum、Container With Most Water | 对撞 / 快慢 |
| Sliding Window | Longest Substring、Minimum Window Substring | 维护窗口状态 |
| Fast/Slow Pointers | Linked List Cycle、Palindrome Linked List | 找中点 / 判环 |
| Merge Intervals | Merge Intervals、Insert Interval | 排序 + 合并 |
| Cyclic Sort | Missing Number、Find All Duplicates | 原地交换 |
| In-place Reversal | Reverse Linked List、Reverse Sublist | 链表翻转 |
| BFS/DFS | Number of Islands、Word Ladder | 队列 / 递归 |
| Two Heaps | Find Median from Data Stream | 大小堆平衡 |
| Subsets | Subsets、Permutations | 回溯 |
| Modified Binary Search | Search Rotated、Find Minimum | 边界收缩 |
| Top K | Top K Frequent、Kth Largest | 堆 / 快速选择 |
| K-way Merge | Merge K Sorted Lists | 优先队列 |
| DP | Climbing Stairs、Longest Common Subsequence | 状态转移 |
| Trie | Word Search II、Design Search Autocomplete | 前缀树 |
9.3.2 经典书籍与课程
| 资料 | 影响 | 用法 |
|---|---|---|
| Gayle McDowell, Cracking the Coding Interview(6th ed.) | 算法 + 行为 + 系统设计三合一 | 必读前 9 章 |
| Aditya Bhargava, Grokking Algorithms(Manning, 2016) | 算法图解入门 | 入门 |
| Thomas Cormen, Introduction to Algorithms(4th ed., MIT Press, 2022) | 算法圣经 | 当参考 |
| NeetCode Roadmap | 14 模式刷题路线 | 主线 |
| Tech Interview Handbook | 算法 + 简历 + 行为 | 综合字典 |
| Blind 75 | 经典 75 题 | 入门题库 |
9.3.3 刷题平台与工具
| 平台 | 特点 | 用法 |
|---|---|---|
| LeetCode | 3000+ 题 | 主平台 |
| NeetCode | 视频 + 路线 | 配套讲解 |
| Codeforces | 高难度 | 进阶训练 |
| HackerRank | 公司题 | 模拟面试 |
| CodeSignal | General Coding Assessment | 公司筛选 |
| Pramp | 免费 mock | 真实 mock |
| Anki | 间隔重复 | 模式卡 |
9.3.4 复杂度分析速记
O(1) 哈希查找、数组下标
O(log n) 二分
O(n) 一次遍历
O(n log n) 排序、堆
O(n²) 双层循环、DP 朴素
O(2^n) 子集、回溯
O(n!) 排列、TSP
9.4 经典问题与经典案例
| # | 问题 | 重要性 | 最简答案 |
|---|---|---|---|
| 1 | Two Sum | 入门哈希 | O(n) 哈希表 |
| 2 | Longest Substring Without Repeating | 滑动窗口模板 | 维护 left/right + set |
| 3 | Merge Intervals | 排序 + 合并 | 排序后遍历合并 |
| 4 | Valid Parentheses | 栈入门 | 栈匹配 |
| 5 | Binary Tree Level Order Traversal | BFS 模板 | 队列 + 层级计数 |
| 6 | Maximum Subarray | DP / Kadane | DP[i] = max(DP[i-1]+a[i], a[i]) |
| 7 | Product of Array Except Self | 前缀后缀 | 两个数组记录前后缀 |
| 8 | Top K Frequent Elements | 堆 / 桶排序 | Counter + heapq.nlargest |
| 9 | Longest Palindromic Substring | DP / Manacher | 中心扩展 |
| 10 | Word Ladder | BFS | 队列 + 邻居生成 |
| 11 | LRU Cache | 设计题 | 哈希 + 双向链表 |
| 12 | Merge K Sorted Lists | 优先队列 | heapq + 弹出最小 |
| 13 | Find Median from Data Stream | Two Heaps | 大小堆平衡 |
| 14 | Regular Expression Matching | DP | 二维 DP |
| 15 | Word Search II | Trie + 回溯 | 前缀树剪枝 |
9.5 学习难点
- 概念难点:DP 状态转移方程不会写;从”一维 DP”、“二维 DP”、“区间 DP”逐步训练。
- 思维难点:拿到题不知道用哪个模式;每题先写”属于哪个模式”,再写解。
- 工程难点:边界用例(空输入、负数、重复)容易漏;写代码前先列 3 类边界。
9.6 技术标准与接口
Entity
14 模式清单、模式卡、刷题记录(LeetCode)、复杂度速记卡、mock 录音。
Scope
算法面试不替代系统设计与行为面试,只解决”现场写出最优解 + 解释复杂度 + 处理边界”。
Structure
- 模式卡:模式名 + 模板代码 + 代表题 + 复杂度 + 边界;
- 刷题记录:题号 + 模式 + 难度 + 用时 + 一次通过率;
- Mock 录音:60 分钟(编码 + 行为),事后听回放;
- 复杂度速记:O(1)/O(log n)/O(n)/O(n log n)/O(n²)/O(2^n)。
Ecosystem
- 刷题平台:LeetCode、Codeforces、HackerRank、CodeSignal、InterviewBit;
- 视频讲解:NeetCode、Back to Back SWE、Kevin Naughton Jr.;
- 间隔重复:Anki、RemNote;
- Mock:Pramp、IGotAnOffer、朋友 mock。
Depth Tiers
- L0:知道 LeetCode 存在;
- L1:能刷 50 题 Easy;
- L2:能按模式刷 150 题;
- L3:能现场 20 分钟解 Medium,5 分钟解 Hard;
- L4:能教别人刷题与模式识别。
本子主题要求:L3。
Source
- NeetCode Roadmap:14 模式刷题路线;
- LeetCode:主刷题平台;
- Tech Interview Handbook:综合字典;
- Cracking the Coding Interview:算法题库;
- 版本快照日期:2026-07-30。
9.7 关键代码
9.7.1 14 模式识别 + 模板映射
# 9.7.1 14 模式识别:题目特征 → 模式
from typing import Literal
Mode = Literal[
"two_pointers", "sliding_window", "fast_slow",
"merge_intervals", "cyclic_sort", "inplace_reversal",
"bfs_dfs", "two_heaps", "subsets", "binary_search",
"top_k", "kway_merge", "dp", "trie",
]
def classify(problem: str) -> Mode:
"""用关键词快速分类题目"""
p = problem.lower()
if "sorted" in p and "two" in p:
return "two_pointers"
if "substring" in p or "subarray" in p:
return "sliding_window"
if "cycle" in p or "palindrome" in p:
return "fast_slow"
if "interval" in p:
return "merge_intervals"
if "missing" in p or "duplicate" in p:
return "cyclic_sort"
if "reverse" in p and "linked" in p:
return "inplace_reversal"
if "island" in p or "tree" in p or "graph" in p:
return "bfs_dfs"
if "median" in p:
return "two_heaps"
if "permutation" in p or "combination" in p:
return "subsets"
if "rotated" in p or "minimum" in p:
return "binary_search"
if "kth" in p or "top k" in p:
return "top_k"
if "k sorted" in p or "merge k" in p:
return "kway_merge"
if "fibonacci" in p or "ways" in p or "minimum cost" in p:
return "dp"
if "prefix" in p or "autocomplete" in p:
return "trie"
return "two_pointers" # 默认兜底
if __name__ == "__main__":
print(classify("Longest Substring Without Repeating Characters"))
9.7.2 Sliding Window 模板
# 9.7.2 Sliding Window:可变窗口模板(最长/最短子串)
def sliding_window(s: str, target_chars: set[str]) -> tuple[int, int]:
"""返回最长子串长度与起止位置"""
need = {c: 0 for c in target_chars}
for c in target_chars:
need[c] = 1
left = 0
have = 0
best = (0, -1, -1)
for right, c in enumerate(s):
if c in need:
need[c] -= 1
if need[c] == 0:
have += 1
while have == len(target_chars):
# 窗口合法,记录结果
if right - left + 1 > best[0]:
best = (right - left + 1, left, right)
# 收缩左边界
cl = s[left]
if cl in need:
if need[cl] == 0:
have -= 1
need[cl] += 1
left += 1
return best
if __name__ == "__main__":
print(sliding_window("ADOBECODEBANC", set("ABC")))
# (4, 9, 12) -> "BANC"
9.7.3 DP:最长公共子序列
# 9.7.3 DP 模板:二维 DP(最长公共子序列 LCS)
def lcs(a: str, b: str) -> int:
n, m = len(a), len(b)
# dp[i][j] = a[:i] 与 b[:j] 的 LCS 长度
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
if a[i - 1] == b[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[n][m]
if __name__ == "__main__":
print(lcs("ABCBDAB", "BDCAB")) # 4
10. 常见误区
- 按难度刷(Easy → Medium → Hard),效率低 3 倍;应该按模式刷;
- 刷题只看题解,不写代码;
- 刷题不记复杂度,面试时被问就崩;
- 模式识别只靠”看”,不靠”刻意训练”;
- 边界用例”应该没问题”,实际漏空输入 / 重复元素;
- 现场写不出最优解,硬撑着写暴力;
- 没用 mock 平台,没在真实环境训练;
- 刷题记录不分类,找不到重复错题;
- 跳过 Hard 题,面试时慌;
- DP 状态转移方程死记硬背,不理解;
- 复杂度分析用错:O(n²) 当成 O(n log n);
- 写完代码不测试;
- 面试时不沟通,闷头写;
- 看到题就慌,不先问澄清问题;
- 复盘只写”做了”,不写”哪里卡了、怎么改”。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
本计划归属:数据结构与算法 主 + 项目与职业能力 辅。
本主题贡献
- 职责:用 blind 75 建立高频题基线;按 LeetCode 模式分类训练识别;沉淀可复用模板库并通过 mock interview 校准现场表现。
- 交付物:blind 75 刷题记录;LeetCode 模式分类卡;模板库与 mock interview 录音复盘。
- 指标:blind 75 完成率 100%;新题 30 秒内完成模式归类;Medium 题 20 分钟内解出率 ≥90%,完成 ≥5 次 mock interview。