Tech Interview Handbook 算法 Cheat Sheet 体系:18 个主题优先级、统一骨架与通用面试技巧解析
在 tech-interview-handbook 仓库中,apps/website/contents/algorithms/study-cheatsheet.md 是 "Algorithms" 栏目唯一的入口页(front-matter 中 sidebar_label: Introduction),它定义了整个数据结构与算法备考资料的组织方式:18 个主题的优先级分级、每份 cheat sheet 必须包含的 7 类内容,以及一套与具体题目无关的通用面试技巧。读完本文,你能掌握如何按优先级搭建自己的 DSA(数据结构与算法)刷题体系,理解仓库中每份专题 cheat sheet 的固定骨架(时间复杂度表、corner cases、技巧与推荐题),并可以直接套用文档总结的输入校验、类型检查、功能式/命令式平衡等实战检查清单。
这个 Cheat Sheet 体系解决什么问题
原文档开篇给出了该栏目的定位:深入覆盖算法面试中高频出现的数据结构与算法的实用知识和技巧。它的核心论断是——"你的技术储备越多,通过面试的概率越高;这些技巧能帮你发现可能遗漏的 corner case,甚至直接引导出最优解"。
从仓库结构可以印证这个入口页的枢纽地位:
- 侧边栏配置 sidebars.js 将
algorithms/study-cheatsheet放在算法栏目首位; - 导航与首页(docusaurus.config.js、index.js)都以
/algorithms/study-cheatsheet作为 "Algorithms" 链接目标; - 旧路径重定向(_redirects 中
/algorithms/introduction、/algorithms/algorithms-introduction)最终都指向该页,说明它是算法板块的总入口; - 仓库其他核心文档也反复回链到它:coding-interview-prep.md 称这些 cheat sheet 是作者"亲自整理的备考笔记,把每个数据结构/算法的最佳学习资源、最佳 LeetCode 题和 must-remembers(技巧、corner cases)组织成一页纸";coding-interview-cheatsheet.md 在"澄清假设"和"讨论边界情况"两个检查步骤中直接引用算法 cheat sheets 作为常见假设与 corner case 的查询来源。
每份专题 Cheat Sheet 的 7 类固定内容
原文档规定了每个主题的学习指南(study guide)都应包含以下 7 类内容:
- 简要概述(A brief overview)
- 学习资源(Learning resources)
- 语言相关的可用库(Language-specific libraries to use)
- 时间复杂度速查表(Time complexities cheatsheet)
- 面试中需要注意的事项(Things to look out for during interviews)
- 边界情况(Corner cases)
- 实用技巧及推荐的练习题(Useful techniques with recommended questions to practice)
对照仓库中实际的专题文件,可以看到这一骨架被完整执行。从 array.md 的源码结构看,实际文件在 7 类规定之外还做了两点扩展:
- 题型分级:"Recommended questions to practice" 被进一步拆成 Essential questions(学习该主题时必须练习的核心题)和 Recommended practice questions(学完并刷完核心题后再刷的进阶题)两级,hash-table.md 与 dynamic-programming.md 均采用同一结构;
- 术语表:先给出 "Common terms",例如 array.md 区分了 Subarray(数组中一段连续值,如
[2,3,6,1,5,4]中[3,6,1]是 subarray 而[3,1,5]不是)与 Subsequence(按原顺序删除部分或全部元素后得到的序列,如[3,1,5]是而[3,5,1]不是)。这类术语辨析正是面试中题目描述歧义高发区。
以下用三个真实文件说明该骨架各部分的形态:
时间复杂度速查表(array.md)
| Operation | Big-O | Note |
|---|---|---|
| Access | O(1) | |
| Search | O(n) | |
| Search (sorted array) | O(log(n)) | |
| Insert | O(n) | 插入需将后续元素整体右移一位,耗时 O(n) |
| Insert (at the end) | O(1) | 插入特例,无需移动其他元素 |
| Remove | O(n) | 删除需将后续元素整体左移一位,耗时 O(n) |
| Remove (at the end) | O(1) | 删除特例,无需移动其他元素 |
array.md 还在 "Things to look out for" 中给出三条实战要点:确认数组是否有重复值(重复会改变答案或让题目变简单/变难);用下标迭代时防止越界;避免在代码里频繁切分或拼接数组——通常 O(n),能用起止下标界定子数组/区间就不要复制数组。
语言库与实现 API(hash-table.md)
| Language | API |
|---|---|
| C++ | std::unordered_map |
| Java | java.util.Map(用 java.util.HashMap) |
| Python | dict |
| JavaScript | Object 或 Map |
hash-table.md 的时间复杂度表也体现了文档的严谨性:Search/Insert/Remove 均标注为 O(1)*,并附注"这是平均情况;面试中哈希表只关心平均情况"。它还顺带说明了两种冲突解决策略(Separate chaining 与 Open addressing),并明确提示"面试中不太会考冲突解决的实现细节"。
Corner cases 与面试陷阱(tree.md)
tree.md 的 "Corner cases" 列出:空树、单节点、两节点、极端倾斜树(退化成链表);"Things to look out for" 则指出:递归版的前/中/后序遍历必须烂熟于心,并建议进一步挑战迭代版——"当候选人太快写完递归版时,面试官有时会要求迭代版"。该文件还给出了 BST 的四个 O(log(n)) 操作表,并提示"当题目涉及 BST 时,面试官通常期望一个快于 O(n) 的解"。
18 个主题的优先级清单
原文档给出了应该为算法面试准备的完整主题清单及其优先级(下表链接已从原文档的局部相对路径 ./xxx.md 转换为仓库根路径):
| Topic | Priority |
|---|---|
| Array | High |
| String | High |
| Hash Table | Mid |
| Recursion | Mid |
| Sorting and searching | High |
| Matrix | High |
| Linked List | Mid |
| Queue | Mid |
| Stack | Mid |
| Tree | High |
| Graph | High |
| Heap | Mid |
| Trie | Mid |
| Interval | Mid |
| Dynamic programming | Low |
| Binary | Low |
| Math | Low |
| Geometry | Low |
分级逻辑值得注意:High 级(数组、字符串、排序/搜索、矩阵、树、图)覆盖了绝大多数面试轮次的核心题面,Mid 级(链表、队列、栈、堆、Trie、区间、哈希表、递归)是高频辅助结构,Low 级(DP、位运算、数学、几何)是低频但可能区分度较高的加分项。以 dynamic-programming.md 为例,它虽然优先级标为 Low,但内容依然完整——开篇直言"DP 通常用于求解优化问题,唯一变强的方法是刷题,需要一定量的练习才能识别出一题适合 DP",并给出核心题(Climbing Stairs、Coin Change、House Robber、Longest Increasing Subsequence)与进阶题(0/1 Knapsack、LCS、Word Break、Unique Paths、Jump Game 等),技巧部分则点出"有时不需要把整个 DP 表存下来,只保留最近两行或两个值即可"。
仓库中还有一份可作交叉参考的细分主题大纲 topics.md,把各主题展开为二级子项,例如 Hash table 下的"冲突解决算法"、Heaps 下的 Insert/Bubble up/Extract max/Remove/Heapify/Heap sort、Graph 下的邻接矩阵/邻接表/邻接映射、Dijkstra、Bellman-Ford、Topo sort、MST、Prim/Kruskal、Union Find 等;配套的参考实现存放在 experimental/utilities 下,如 mergeSort.js、graph_dfs.py、trie.py、union_find.py、tree_mirror.py,可当作各主题技巧的动手范本。
通用面试技巧(General interview tips)
这是原文档中信息密度最高的部分,与具体数据结构无关,适用于所有算法题。以下按原文完整梳理:
1. 澄清下意识做出的假设。 很多题目是故意欠规范(under-specified)的,要把你潜意识里做的假设说出来向面试官确认。
2. 永远先验证输入。 检查非法/为空/负数/类型不符的输入,绝不假设参数一定合法。另一种做法是直接和面试官确认"是否可以假设输入合法"(答案通常是"是"),这样可以省下写输入校验代码的时间。
3. 明确时间/空间复杂度要求或约束。 这是选择算法与数据结构的前置条件。
4. 检查 off-by-one(差一)错误。
5. 在无自动类型转换的语言中,确认拼接操作数的类型一致:int/str/list 混拼是隐蔽 bug 的高发点。
6. 写完代码后,用若干示例输入测试你的解法。
7. 判断算法是否需要被多次调用。 例如运行在 Web 服务器上时,输入很可能可以预处理,从而提升每次调用的效率。
8. 混合使用函数式与命令式两种范式:
- 尽可能写纯函数;纯函数更容易推理,能减少实现中的 bug;
- 除非确定自己在做什么,否则避免修改按引用传入的参数;
- 函数式写法由于不可变性和反复分配新对象,空间开销通常更大;命令式代码操作已有对象,速度更快。因此需要在"正确性 vs 效率"之间取得平衡,在合适的位置使用适量的函数式与命令式代码;
- 避免依赖并修改全局变量——全局变量会引入状态;
- 如果不得不依赖全局变量,确保不会误改它。
9. 提速的两种途径与理论上限。 原文指出,提高程序速度只有两条路:(1) 选择更合适的数据结构/算法;(2) 使用更多内存。后者体现经典的时空权衡,但"更快的速度不一定必须以牺牲空间为代价"。同时注意时间复杂度存在理论下限——例如在未排序数组中找最小/最大元素,任何算法都不可能快于 O(N)。
10. 数据结构是你的武器。 为正确的战场选择正确的武器是胜利关键,务必熟悉每种数据结构的强项及其各类操作的时间复杂度。数据结构还可以组合增强(augment)以获得跨操作的效率:例如哈希表配合双向链表可以实现 LRU 缓存中 get 和 put 均为 O(1)。
11. 哈希表是最常被使用的数据结构。 如果卡在一道题上,最后的补救办法是枚举常见的候选数据结构("好在数量不多"),逐一考虑其是否适用于当前问题——作者本人靠这一招救过场。
12. 如果代码中走了捷径,大声说出来。 向面试官声明你在非面试环境(无时间压力)下会怎么做。原文给出的示例是:"我会写一个正则来解析这个字符串,而不是用可能覆盖不全所有情况的 split()。"
推荐的课程资源
入口页末尾通过导入 _courses/AlgorithmCourses.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。
这三门课与 18 个专题 cheat sheet 形成互补:cheat sheet 负责"考什么、注意什么、练哪几道题"的课程表,课程负责系统化的解题模式训练。
如何使用这套体系:可验证的落点
结合仓库内证据,一套可执行的备考路径是:
- 定顺序:按上表优先级,从 High 级六个主题(Array、String、Sorting and searching、Matrix、Tree、Graph)开始;
- 走骨架:对每个主题,依次读该专题页的 Introduction → Learning resources → Common terms → Time complexity → Things to look out for → Corner cases → Techniques 七个固定小节;
- 刷两级题:先刷 Essential questions,再刷 Recommended practice questions(两个清单在每篇专题页末尾均有明确分节);
- 对答案:做题前用 coding-interview-cheatsheet.md 的面试流程检查项自查,其中"澄清假设"与"边界情况"两项直接回链到本文档所在的算法 cheat sheets;
- 查实现:需要动手验证某个技巧(排序、DFS、Trie、并查集等)时,参考 experimental/utilities 下的 JavaScript 与 Python 参考实现,以及 topics.md 的二级主题大纲做查漏补缺。
需要说明的是,本文所有内容均取自当前仓库文档与源码:优先级表、7 类固定内容、通用技巧逐条出自 study-cheatsheet.md 原文;各专题的时间复杂度表、术语辨析与题型清单分别出自对应专题文件;课程信息出自 AlgorithmCourses.md。仓库中不存在该栏目效果的量化数据,本文也不做任何此类断言。
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 StartedRust0622
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