CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

算法与数据结构面试:14 模式 + 300 题系统化训练

分类:项目与职业能力 · 路径:docs/topics/coding-interview/README.md

#algorithm#leetcode#coding-interview#data-structures#complexity

用 4~6 周按 14 模式刷完 300 道 LeetCode,能现场 20 分钟解出 Medium 题

父主题

求职与技术面试:从简历到 offer 的工程化准备

子主题(0)

算法与数据结构面试:14 模式 + 300 题系统化训练

0. 元信息

1. 学习路线

14 模式识别框架
  → 模式卡建立(每个模式 5~10 题)
  → Blind 75 / NeetCode 150 滚动刷
  → 时间空间复杂度训练
  → 边界用例 + Follow-up 习惯
  → Mock coding interview 录音

每一步都是下一步的前置:没有模式识别就刷题是题海;没有时间复杂度训练就现场写不出最优解。

2. 阶段周数分配

阶段4 周方案6 周方案备注
1. 14 模式识别框架0.50.5模式清单 + 分类规则
2. 模式卡建立(每模式 5~10 题)11.514 张模式卡(Anki / Markdown)
3. Blind 75 / NeetCode 150 滚动刷1.52150 题刷题记录
4. Hard 进阶 + 复杂度训练0.5150 题复杂度速记
5. 边界用例 + Mock 综合0.515 次 mock + 复盘
合计46

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-off50 题复杂度卡片面试中能边写边分析复杂度
5. 边界用例空输入 / 单元素 / 全相同 / 极值 / 重复30 题边界用例清单提交前能列举 5 类边界
6. Mock codingPramp / 朋友 / 录音 / 计时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 2Two Pointers 模式:刷 5 道代表题(Two Sum II / 3Sum / Container With Most Water),每题写模式 + 模板 + 复杂度5 道题解 + 1 张模式卡
Day 3Sliding Window 模式:刷 5 道代表题(Longest Substring / Minimum Window Substring),写最小可复用模板5 道题解 + 1 张模式卡
Day 4BFS/DFS 模式:刷 5 道代表题(Number of Islands / Word Ladder / Clone Graph),强调队列 / 递归5 道题解 + 1 张模式卡
Day 5DP 入门:刷 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. 阶段通用验收

  1. 不看答案独立重写 ≥ 60 道刷过的题(每题 ≤ 20 分钟);
  2. 用自己的话解释每个题属于哪个 14 模式、为什么这样写、复杂度是多少;
  3. 画一张图:复杂度速记卡(O(1)/O(log n)/O(n)/O(n log n)/O(n²)/O(2^n) + 对应例题);
  4. 测试 5 类边界用例:空输入 / 单元素 / 全相同 / 极值 / 重复;
  5. 准备至少 3 组自定义数据并贴出实际输出(手写 + LeetCode 提交记录);
  6. 记录每个题的时间 / 空间复杂度,能边写边分析 trade-off;
  7. 能修改已有题解(换模式、加边界、加 follow-up),不是只照抄题解。

6. 最终验收

7. 综合项目

首选:求职 Sprint 的 coding 子模块(必做:14 模式卡 + 300 题刷题记录 + 5 次 mock 录音 + 复杂度速记卡)。

备选:14 模式精讲笔记(每模式 5 道代表题 + 模板 + 复杂度 + 边界 + 3 道 follow-up),适合”已刷过 100 题想系统化”的求职者。

任何综合项目都必须包含:

  1. 14 模式清单与识别规则;
  2. 模式卡(每模式 5~10 题 + 模板代码 + 复杂度 + 边界);
  3. 刷题记录(300 题,分布可计算);
  4. 复杂度速记卡(50 题,能边写边分析);
  5. 边界用例清单(30 题,5 类边界覆盖);
  6. mock 录音 + 复盘(5 次,每场 60 分钟);
  7. README(含刷题 window、目标、产出、复盘);
  8. retrospective.md(含教训、改进、下一轮)。

notes/ 与 README 存放规范

所有”模式卡 / 复杂度卡 / 边界用例 / mock 复盘”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:

8. 推荐开源资料

阶段角色资料链接用法
全部经典书Gayle McDowell《Cracking the Coding Interview》https://www.crackingthecodinginterview.com/算法 + 行为 + 系统设计三合一
全部入门Aditya Bhargava《Grokking Algorithms》https://www.manning.com/books/grokking-algorithms算法图解入门
1路线NeetCode Roadmaphttps://neetcode.io/roadmap14 模式刷题路线
1综合Tech Interview Handbookhttps://www.techinterviewhandbook.org/求职综合字典
2视频NeetCode YouTubehttps://www.youtube.com/c/NeetCode算法视频讲解
3题库LeetCodehttps://leetcode.com/主刷题平台
3题库Blind 75https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions75 题经典入门
4进阶Codeforceshttps://codeforces.com/高难度训练
5mockPramphttps://www.pramp.com/免费 mock
5间隔Ankihttps://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 PointersTwo Sum II、3Sum、Container With Most Water对撞 / 快慢
Sliding WindowLongest Substring、Minimum Window Substring维护窗口状态
Fast/Slow PointersLinked List Cycle、Palindrome Linked List找中点 / 判环
Merge IntervalsMerge Intervals、Insert Interval排序 + 合并
Cyclic SortMissing Number、Find All Duplicates原地交换
In-place ReversalReverse Linked List、Reverse Sublist链表翻转
BFS/DFSNumber of Islands、Word Ladder队列 / 递归
Two HeapsFind Median from Data Stream大小堆平衡
SubsetsSubsets、Permutations回溯
Modified Binary SearchSearch Rotated、Find Minimum边界收缩
Top KTop K Frequent、Kth Largest堆 / 快速选择
K-way MergeMerge K Sorted Lists优先队列
DPClimbing Stairs、Longest Common Subsequence状态转移
TrieWord 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 Roadmap14 模式刷题路线主线
Tech Interview Handbook算法 + 简历 + 行为综合字典
Blind 75经典 75 题入门题库

9.3.3 刷题平台与工具

平台特点用法
LeetCode3000+ 题主平台
NeetCode视频 + 路线配套讲解
Codeforces高难度进阶训练
HackerRank公司题模拟面试
CodeSignalGeneral 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 经典问题与经典案例

#问题重要性最简答案
1Two Sum入门哈希O(n) 哈希表
2Longest Substring Without Repeating滑动窗口模板维护 left/right + set
3Merge Intervals排序 + 合并排序后遍历合并
4Valid Parentheses栈入门栈匹配
5Binary Tree Level Order TraversalBFS 模板队列 + 层级计数
6Maximum SubarrayDP / KadaneDP[i] = max(DP[i-1]+a[i], a[i])
7Product of Array Except Self前缀后缀两个数组记录前后缀
8Top K Frequent Elements堆 / 桶排序Counter + heapq.nlargest
9Longest Palindromic SubstringDP / Manacher中心扩展
10Word LadderBFS队列 + 邻居生成
11LRU Cache设计题哈希 + 双向链表
12Merge K Sorted Lists优先队列heapq + 弹出最小
13Find Median from Data StreamTwo Heaps大小堆平衡
14Regular Expression MatchingDP二维 DP
15Word Search IITrie + 回溯前缀树剪枝

9.5 学习难点

9.6 技术标准与接口

Entity

14 模式清单、模式卡、刷题记录(LeetCode)、复杂度速记卡、mock 录音。

Scope

算法面试不替代系统设计与行为面试,只解决”现场写出最优解 + 解释复杂度 + 处理边界”。

Structure

Ecosystem

Depth Tiers

本子主题要求:L3

Source

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. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力

本计划归属:数据结构与算法 主 + 项目与职业能力 辅。


本主题贡献

直接依赖(1)

查看知识图谱 · 热度 🔥极高