tech-interview-handbook 的 3 个月编码面试学习计划:按优先级排布的 18 个主题、75 道刷题清单与非编码准备时间表
【免费下载链接】tech-interview-handbookCurated coding interview preparation materials for busy software engineers项目地址: https://gitcode.com/GitHub_Trending/te/tech-interview-handbook
这篇文章基于 tech-interview-handbook 仓库中的编码面试学习计划文档,完整还原其 3 个月备考方案:前 4 周按 High/Mid/Low 优先级排布的 18 个算法主题学习表(含每周建议耗时),第 5–12 周从仓库 QuestionGroups.json 数据源逐题继承的 75 道练习题清单,以及自我介绍、追问面试官、Mock 面试的配套时间安排。读完后你可以直接得到一份可复制、可按剩余时间裁剪的周粒度备考排期。
准备周期与三种备考策略
文档给出的核心建议是:3 个月(每周投入约 11 小时)是推荐的准备周期。如果你没有那么多时间,文档提到可以借助作者构建的 Grind 75 工具为任意剩余时间生成练习题计划,并支持按难度、主题过滤以及不同的题目分组方式。
在开始刷编码题之前,如果核心数据结构和算法知识不熟悉,建议先复习再进入刷题。文档明确列出了三种可选的备考策略:
- 广度优先(Breadth-first preparation):先复习所有主题,再开始跨主题练习各类题目。推荐剩余时间约有一个月的人使用。
- 深度优先(Depth-first preparation):一次攻克一个主题——先复习该主题资料,再大量练习该主题的题,确认掌握后再进入下一个主题。时间紧张时可以考虑此策略,并优先聚焦学习计划中标记为 High 优先级的主题。
- 深度优先转广度(Depth-first-then-breadth preparation):一次攻克一个主题(复习 + 少量题目),全部主题过完后,再跨主题混合练习各类题目。该策略耗时最长,推荐剩余时间超过一个月的人使用。
作者的推荐是广度优先或深度优先转广度,理由是备考计划中必须保留一定比例的广度层面的学习/练习,避免学到后面的主题时把前面的主题忘掉。
Week 1–4:按优先级排布的主题学习
文档要求:每个学习计划中都会给出主题列表、学习资源和练习题,应当按优先级顺序逐周完成。文档还给了两条使用建议:
- 建立一个模板,把剩余的天数和每天可投入的小时数拆开,再把每周的主题/题目填进去;
- 时间估算要偏保守,避免 burn out(过度疲劳)。
第 1–4 周是"主题学习 + 练习"阶段。每周学习资源链接的是仓库中的算法 cheatsheet(位于 apps/website/contents/algorithms/ 目录),它们提供时间复杂度、corner case、主题专属技巧的总览,以及必备与推荐的练习题。文档同时强调:练习早期就要开始套用编码面试最佳实践中的行为和编码面试技巧中的方法。
Week 1
| 主题 | 优先级 | 建议耗时 |
|---|---|---|
| Array(数组) | High | 2 小时 |
| String(字符串) | High | 3 小时 |
| Hash Table(哈希表) | Mid | 3 小时 |
| Recursion(递归) | Mid | 3 小时 |
Week 2
| 主题 | 优先级 | 建议耗时 |
|---|---|---|
| Sorting and Searching(排序与查找) | High | 3 小时 |
| Matrix(矩阵) | High | 1 小时 |
| Linked List(链表) | Mid | 3 小时 |
| Queue(队列) | Mid | 2 小时 |
| Stack(栈) | Mid | 2 小时 |
Week 3
| 主题 | 优先级 | 建议耗时 |
|---|---|---|
| Tree(树) | High | 4 小时 |
| Graph(图) | High | 4 小时 |
| Heap(堆) | Mid | 3 小时 |
| Trie(前缀树) | Mid | 3 小时 |
Week 4
| 主题 | 优先级 | 建议耗时 |
|---|---|---|
| Interval(区间) | Mid | 2 小时 |
| Dynamic Programming(动态规划) | Low | 4 小时 |
| Binary(二进制) | Low | 2 小时 |
| Math(数学) | Low | 1 小时 |
| Geometry(几何) | Low | 1 小时 |
学习资源 cheatsheet 的内部结构
以第一周的 Array cheatsheet 为例,可以看清"2 小时/3 小时"耗时的学习对象长什么样。每个主题页都按固定骨架组织:
- Learning resources:外部阅读与视频资源;
- Common terms:常见术语(如 subarray 与 subsequence 的区别及示例);
- Time complexity 表格:如数组 Access O(1)、Search O(n)、Insert/Remove O(n)(末尾增删 O(1));
- Things to look out for / Corner cases:如"确认数组是否有重复值""遍历时防越界""切片和拼接数组是 O(n),尽量用起止下标划分子区间",corner case 覆盖空序列、1~2 个元素、重复元素等;
- Techniques:数组/字符串通用的解法套路——滑动窗口、双指针、从右往左遍历、先排序、前缀和预计算、把下标当哈希键等,每条都附示例题目;
- Essential questions / Recommended practice questions:必备题与进阶练习题,例如数组主题的必备题为 Two Sum、Best Time to Buy and Sell Stock、Product of Array Except Self、Maximum Subarray。
仓库内其余 17 个主题页(string.md、hash-table.md、tree.md 等)均采用同一结构,可对照每周表格逐一复习。
Week 5–12:75 道深度刷题清单
文档说明:第 5–12 周列出的 75 道题用于把备考做到"fully prepared"。该清单由 Grind 75 工具生成(按剩余时间生成推荐学习计划,支持难度、主题过滤与题目分组)。两点使用注意来自原文:
- 如果完成了 Week 1–4 的主题学习,其中一些题已经做过,可以跳过或重做;
- 如果没有学过动态规划、或认为其不相关,可以直接跳过 DP 题——很多 DP 题本来也能用递归/回溯解决。
这些题目在仓库中以静态数据维护在 QuestionGroups.json,由 QuestionList.js 组件渲染为按"第 5 周至第 12 周"分组的表格(Problem / Difficulty / Duration 三列),难度标签按 Easy 绿色、Medium 橙色、Hard 红色着色(见 QuestionList.js 第 5–19 行)。JSON 中每道题的字段包括:slug、title、url(LeetCode 题目页)、duration(建议分钟数)、difficulty、topic(所属主题)、routines(涉及的技巧,如 sliding-window、two-pointers、backtracking)以及可选的epi标记(在《Algorithms and Data Structures - The Job Interview Challenge》中的对应章节编号,0/null表示该题不在书中)。
难度与题量分布
| 周次 | 难度 | 题数 |
|---|---|---|
| Week 5 | Easy | 12 |
| Week 6 | Easy | 12 |
| Week 7 | Medium | 10 |
| Week 8 | Medium | 8 |
| Week 9 | Medium | 8 |
| Week 10 | Medium | 9 |
| Week 11 | Medium ×6 + Hard ×1 | 7 |
| Week 12 | Hard | 8 |
| 合计 | Easy 24 / Medium 42 / Hard 9 | 75 |
Week 5 练习题(Easy)
- Two Sum — 15 分钟(array,技巧:hashing)
- Valid Parentheses — 20 分钟(stack)
- Merge Two Sorted Lists — 20 分钟(linked-list)
- Best Time to Buy and Sell Stock — 20 分钟(array)
- Valid Palindrome — 15 分钟(string,palindrome)
- Invert Binary Tree — 15 分钟(binary-tree)
- Valid Anagram — 15 分钟(string,anagram)
- Binary Search — 15 分钟(binary-search)
- Flood Fill — 20 分钟(graph,matrix + depth-first-search)
- Lowest Common Ancestor of a Binary Search Tree — 20 分钟(binary-search-tree)
- Balanced Binary Tree — 15 分钟(binary-tree)
- Linked List Cycle — 20 分钟(linked-list,two-pointers)
Week 6 练习题(Easy)
- Implement Queue using Stacks — 20 分钟(stack)
- First Bad Version — 20 分钟(binary-search)
- Ransom Note — 15 分钟(hash-table)
- Climbing Stairs — 20 分钟(dynamic-programming)
- Longest Palindrome — 20 分钟(string,palindrome)
- Reverse Linked List — 20 分钟(linked-list)
- Majority Element — 20 分钟(array,sorting)
- Add Binary — 15 分钟(binary)
- Diameter of Binary Tree — 30 分钟(binary-tree)
- Middle of the Linked List — 20 分钟(linked-list,two-pointers)
- Maximum Depth of Binary Tree — 15 分钟(binary-tree)
- Contains Duplicate — 15 分钟(array,hash-table + sorting)
Week 7 练习题(Medium)
- Min Stack — 20 分钟(stack)
- Maximum Subarray — 20 分钟(dynamic-programming)
- Insert Interval — 25 分钟(array,interval)
- 01 Matrix — 30 分钟(graph,breadth-first-search)
- K Closest Points to Origin — 30 分钟(heap,geometry)
- Longest Substring Without Repeating Characters — 30 分钟(string,sliding-window)
- 3Sum — 30 分钟(array,two-pointers)
- Binary Tree Level Order Traversal — 20 分钟(binary-tree)
- Clone Graph — 25 分钟(graph,DFS + BFS)
- Evaluate Reverse Polish Notation — 30 分钟(stack)
Week 8 练习题(Medium)
- Course Schedule — 30 分钟(graph,topo-sort)
- Implement Trie (Prefix Tree) — 35 分钟(trie)
- Coin Change — 25 分钟(dynamic-programming)
- Product of Array Except Self — 30 分钟(array,prefix-sum)
- Validate Binary Search Tree — 20 分钟(binary-search-tree)
- Number of Islands — 25 分钟(graph,DFS + BFS)
- Rotting Oranges — 30 分钟(graph,breadth-first-search)
- Search in Rotated Sorted Array — 30 分钟(binary-search)
Week 9 练习题(Medium)
- Combination Sum — 30 分钟(array,backtracking)
- Permutations — 30 分钟(recursion,backtracking)
- Merge Intervals — 30 分钟(array,interval)
- Lowest Common Ancestor of a Binary Tree — 25 分钟(binary-tree)
- Time Based Key-Value Store — 35 分钟(binary-search)
- Accounts Merge — 30 分钟(graph,DFS + union-find)
- Sort Colors — 25 分钟(array,two-pointers)
- Word Break — 30 分钟(trie)
Week 10 练习题(Medium)
- Partition Equal Subset Sum — 30 分钟(dynamic-programming)
- String to Integer (atoi) — 25 分钟(string)
- Spiral Matrix — 25 分钟(matrix)
- Subsets — 30 分钟(recursion,backtracking)
- Binary Tree Right Side View — 20 分钟(binary-tree)
- Longest Palindromic Substring — 25 分钟(string,palindrome + two-pointer + DP)
- Unique Paths — 20 分钟(dynamic-programming)
- Construct Binary Tree from Preorder and Inorder Traversal — 25 分钟(binary-tree)
- Container With Most Water — 35 分钟(array,greedy + two-pointers)
Week 11 练习题(Medium ×6 + Hard ×1)
- Letter Combinations of a Phone Number — 30 分钟(recursion,backtracking)
- Word Search — 30 分钟(graph,backtracking)
- Find All Anagrams in a String — 30 分钟(string,anagram)
- Minimum Height Trees — 30 分钟(graph,topo-sort)
- Task Scheduler — 35 分钟(heap)
- LRU Cache — 30 分钟(linked-list,hash-table)
- Kth Smallest Element in a BST — 25 分钟(binary-search-tree)
- Minimum Window Substring — 30 分钟(string,sliding-window,Hard)
Week 12 练习题(Hard)
- Serialize and Deserialize Binary Tree — 40 分钟(binary-tree)
- Trapping Rain Water — 35 分钟(stack,monotonic-stack)
- Find Median from Data Stream — 30 分钟(heap)
- Word Ladder — 45 分钟(graph,breadth-first-search)
- Basic Calculator — 40 分钟(stack,parsing)
- Maximum Profit in Job Scheduling — 45 分钟(binary-search,dynamic-programming)
- Merge k Sorted Lists — 30 分钟(heap)
- Largest Rectangle in Histogram — 35 分钟(stack,monotonic-stack)
可以观察到清单的设计逻辑:前两周全部为 Easy 用于建立手感,随后三周推进到 Medium,最后两周集中消化 Hard 题,且 Hard 题的建议用时(30–45 分钟)也高于 Easy 题(15–30 分钟)。主题覆盖上,graph(8 题)、binary-tree(10 题)、array(10 题)、stack(7 题)是出现频率最高的板块,与 Week 1–4 主题表中 High 优先级的 Tree、Graph 相互呼应。
Grind 75 在线工具的仓库实现
原文推荐的 Grind 75 工具用于记录刷题进度。从源码结构看,仓库中 functions/grind75/[[catchall]].js 是一个页面函数代理:它把站点/grind75路径下的所有请求(保留路径与查询串)转发到工具实际托管的域名并返回其内容,即该工具本身独立部署,仓库内只保留转发入口。
为自我介绍、追问与 Mock 面试预留时间
文档的最后一部分提醒:编码题之外,还要准备自我介绍、留给面试官的追问(final questions),并安排 mock coding interviews。
准备自我介绍与追问清单(建议约 3 小时)
原文建议预留约 3 小时来打磨自我介绍并准备追问,配套两份指南:
- 自我介绍指南:核心是把 "Tell me about yourself" 当作一次 elevator pitch,给出 4 步法——先讲基础背景信息(校名/专业/重点方向/过往公司与亮点项目)、KISS 原则(只讲亮点与数字,不展开细节)、说明"他们为什么想要你"(经验与目标公司技术栈/产品的相关性)、以及反复练习到自然流畅;文中还附有针对 Meta、Lyft 两个前端岗位的真实自我介绍范例及逐句拆解。
- 追问指南:按"了解技术工作、了解岗位、了解文化与福利、了解团队领导与管理、了解公司方向"五个维度组织可提问清单,帮助你在面试结尾提出高质量问题。
安排 Mock Coding Interview
原文建议:当编码题学习和练习进度达到60%时,就开始预约 mock 面试。面试时段通常由面试官一侧提供,可以提前查看并预订。原文推荐作者个人使用过的 interviewing.io 平台,并指向 mock-interviews 文档,其中还列出了 Pramp、Hello Interview、Meetapro、Codemia 等其他平台的对比信息。
执行要点与仓库延伸阅读
把整份计划落地时,可以对照以下要点:
- 先拆时间再排题:按剩余天数 × 每天保守小时数建模板,再把各周主题/题目填入,避免估算过满导致 burnout;
- 优先级驱动:时间不足时保留 High 优先级主题(Array、String、Sorting and Searching、Matrix、Tree、Graph),Low 优先级的 DP、Binary、Math、Geometry 可后置或跳过(DP 题在刷题清单中也可按原文说明跳过);
- 技巧贯穿全程:Week 1 起就配合 coding-interview-cheatsheet(面试行为规范)与 coding-interview-techniques(解法寻找与复杂度优化方法)练习,而不是刷完题再补;
- 进度可追踪:借助 Grind 75 工具维护刷题状态,题目数据以 QuestionGroups.json 为准,字段中的
topic与routines可帮助按主题或技巧二次过滤。
仓库中与该计划同属面试准备主线的其他文档(见 sidebars.js 中的文档分组):coding-interview-prep、coding-interview-cheatsheet、coding-interview-techniques、mock-interviews,以及算法速查总入口 algorithms/study-cheatsheet,可作为本计划的配套材料继续深入。
【免费下载链接】tech-interview-handbookCurated coding interview preparation materials for busy software engineers项目地址: https://gitcode.com/GitHub_Trending/te/tech-interview-handbook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考