算法面试题解汇总:用模式识别搭建可复习知识库

发布时间:2026/10/28 22:20:52
算法面试题解汇总:用模式识别搭建可复习知识库 算法面试准备到第三个月很多人会撞上一个特别难受的状态题量已经过了三百打开新题还是发懵翻到旧题只能想起我好像做过这道。这不是刷得不够是刷进去的东西没留下痕迹。我前后迭代了四版自己的题解汇总从最早一堆散落的 Markdown 文件到现在一套能在两周内快速回炉的体系中间推翻重来过两次。这篇就聊题解汇总这件事本身——它不是把答案抄一遍存起来而是一套围绕模式识别搭起来的私人知识库专门解决三个具体问题做题时想不起套路、复习时找不到重点、面试时调不出模板。适合题量已经过百但效果打折的人也适合刚起步想少走弯路的同学。下面全是我自己跑通的流程包括文件怎么放、单题题解写哪几段、索引表怎么维护、复习怎么排期都是能直接抄作业的。1. 为什么刷了三百道还是不会题解汇总到底解决什么问题1.1 从见过到会做之间隔着一整条沟大部分人刷题的心理账户是这样的做出来一道就等于掌握一道题量累加能力线性增长。实际情况完全不是。一道题从接触到能在面试里稳定复现中间至少隔三层第一层是认得出看到题能反应过来考的是哪个模式第二层是写得出二十分钟内手写无 bug 的代码第三层是讲得清能向面试官解释为什么这样设计、复杂度怎么算、边界在哪里。绝大多数人刷完一道题只停在了第一层甚至只是看着答案觉得有道理这种伪第一层。这三层之间的衰减速度差得惊人。第一层大概能撑两到三周第二层如果不动手重写一周就掉第三层基本属于当时会讲隔天就忘。而面试考的恰恰是第二层和第三层。所以问题不在于你做了多少题而在于你有没有一个机制把第一层的瞬时记忆固化成第二层的肌肉记忆和第三层的表达素材。题解汇总就是这个机制的载体。我做过一个很粗糙的对照实验同样一批二十道题一组只做不记一组做完写完整题解。两周后重做只做不记的那组平均只能独立写出六道另一组能写出十四道剩下六道里有四道看一眼自己的题解就能立刻重建思路。差距不在聪明程度在于有没有给自己留一个重新进入的入口。1.2 题解汇总真正在干的活记忆外化、模式抽象、复盘索引很多人对题解汇总的理解是错题本这个定位太窄了只发挥了它三成的作用。我把它拆成三个功能每个功能对应一个具体的痛点。记忆外化是最基础的一层。人的工作记忆容量有限装不下几十种模板的细节。你不需要记住滑动窗口的右指针什么时候收缩你需要记住这个知识点记在我的哪份文件里关键词是什么。把细节丢给笔记把索引留在大脑这是所有高强度知识工作的通用做法。我做题时脑子里想的不是完整代码而是这是单调栈的变体模板在栈那一节然后靠肌肉记忆把模板敲出来。模式抽象是第二层也是最值钱的一层。同一类题做三道如果不主动归纳你得到的是三道独立的题如果强制写一句这三道题的共同触发条件是 XXX区别在于 XXX你得到的是一把能开一片锁的钥匙。题解汇总的价值就在这里——它是被迫做抽象的场合。你写不下去那句话说明你其实没真的懂。复盘索引是第三层。错题本按时间排列价值很低因为你复盘时想找的是我当时为什么错而不是我三月份错了哪些。题解汇总按模式排列你可以一次性把二分边界写错的所有题拉出来集中处理效率差好几倍。1.3 什么样的题解汇总值得做三条硬标准不是所有记录都有价值。我见过太多人把答案截图贴进笔记软件然后从来没打开过。判断一份题解汇总值不值得维护我自己的标准是三条缺一条就说明这份东西是自我安慰。第一条三个月后的自己能看懂。这条最狠。写题解时你刚做完题脑子里全是上下文写一句这里注意边界你觉得够了三个月后你根本不知道这里是哪儿、边界是左还是右。所以我的规矩是所有指代必须落到具体变量名和具体数值上禁止出现注意细节处理一下特殊情况这种话。第二条五分钟内能重建思路。打开一份题解如果五分钟内你不能凭它重新把代码写出来这份题解就是失败的。要么思路段写得太跳要么代码段缺注释。我经常拿自己的旧题解做这个测试不通过就当场重写。第三条能回答为什么不用另一个方案。只记录最优解是不够的。面试里经常出现你能想到更优的吗这个方案的问题在哪如果你题解里只写了最优解等于放弃了对比论证的素材。每份题解我都要求自己至少写一句暴力解法为什么不行或者另一种思路为什么退化。注意三条标准里第一条和第二条是自检用的第三条是面试用的。前两条不过关这份汇总就是废纸别舍不得删。2. 动手之前题单分层与知识地图怎么搭2.1 按模式组织而不是按题号或难度新手最容易犯的错是拿一个题号列表从头刷到尾刷到哪算哪。这样做的后果是同类题分散在时间轴的两端等你刷到第二道双指针的时候第一道已经忘了抽象根本发生不了。正确的组织单位是模式pattern一道题属于哪个模式比它标着中等还是困难重要得多。我整理的常考模式清单大概是这样按出现频率从高到低排数组双指针与原地修改、滑动窗口、二分查找含答案空间二分、哈希计数与去重、前缀和与差分、链表指针操作、栈与单调栈、堆与 TopK、二叉树遍历与递归构造、回溯与剪枝、网格 DFS/BFS、拓扑排序、并查集、区间排序与贪心、动态规划线性、区间、背包、状态机四个子类、字符串匹配、位运算、图的最短路。这十八个模式覆盖了绝大多数面试里会遇到的题。每个模式对应一个文件夹文件夹里放三类内容模式总览这个模式的触发条件、模板、常见变形、代表题题解、变式题题解。这个结构的关键在于模式总览这一层——它是你把 N 道题压成一页纸的地方也是复习时最先看的东西。2.2 三层配比模板题、变式题、综合题按 3:5:2 铺开题单不是越多越好是要有结构。我的配比是模板题三成、变式题五成、综合题两成。按一百二十题的核心清单算就是三十六道模板题、六十道变式题、二十四道综合题。模板题的作用是把模板刻进手。这类题的特征是毫无包装直接考一个模式的最裸形态比如最基础的二分查找、最基础的无重复字符滑动窗口。这类题不需要多每个模式两三道足够但要求做到闭卷默写、一次通过。变式题是主体占一半。它们的特征是套了一层壳需要你先识别出壳下面是什么模式。比如同样是滑动窗口有的是求最长有的是求最短有的窗口收缩条件是计数超过阈值有的收缩条件是总和超过限制。变式的价值在于训练识别能力而识别能力恰恰是面试里最稀缺的。综合题占两成特征是两个模式叠在一起比如二分加贪心、拓扑排序加动态规划、前缀和加哈希。这类题在面试里出现频率不算高但一旦出现就是区分度题。做综合题的重点不是背是记录我是怎么拆开的——拆解过程比答案本身值钱。2.3 一百二十题的核心清单是怎么筛出来的筛选标准有四条全部满足才进核心清单。第一高频这个模式在近年的面试题里反复出现不是偏门。第二能抽象出模板做完这道题我能写出一段可复用的代码骨架而不是一次性技巧。第三有明确的边界坑空输入、单元素、重复元素、整数溢出、闭开区间至少踩中一个因为边界是面试最容易挂的地方。第四存在一题多解至少有暴力解和最优解两档能支撑你为什么不用另一种的追问。按这四条筛下来很多人会惊讶地发现题库里刷得最欢的那些花活题基本进不了清单。这很正常。面试考的是稳定输出不是炫技。我自己的核心清单里困难题只占不到两成而且每一道都能对应回某个基础模式的组合。提示清单要留出淘汰位。每个月我会把掌握度连续两次达到满分的题移出核心清单放进归档文件夹。清单保持在一百二十题上下浮动不要无限膨胀否则复习成本会失控。3. 单题题解的写法从抄答案到可复用的知识块3.1 一份合格题解必须包含的五段结构这是整套体系里最核心的部分。我给每道题定死了五段顺序不能变缺一段就算没写完。这个约束听起来死板但它解决了一个大问题复习时的阅读路径是固定的你不用每次重新适应格式。第一段一句话定性。格式是模式 触发条件比如滑动窗口触发条件是求满足某条件的最长连续子段。这一句是给未来的自己看的索引三十个字以内必须包含模式名。第二段思路推演。写清楚从暴力到最优的岔路口在哪。不要直接写最优解要写我一开始想的是 XXX复杂度是 XXX卡在 XXX所以换成了 YYY。这段是整份题解最有价值的部分因为它记录的是思考路径而不是结论。面试时你需要复现的正是这条路径。第三段代码。要求可运行、变量名有意义、关键行有注释。注释只写为什么不写是什么——i 1不需要注释但while left right用的是半开区间还是闭区间必须写清楚。第四段复杂度与边界。时间、空间都要写还要写常数项和递归深度这类容易被追问的点。边界单独列一行把所有特殊输入列出来。第五段坑与变式。记录这道题最容易写错的地方以及它能怎么变形。变形方向至少写两个这是面试追问的预演。3.2 复杂度和边界条件的记录规范复杂度这块很多人只写一个 Big-O 就完事这在面试里是要吃亏的。面试官经常追问这个 O(n) 的常数大不大递归深度会不会爆栈空间能不能优化到 O(1)。所以我的记录格式是三行时间复杂度、空间复杂度、附加说明。附加说明里我会写这几类东西哈希表的实际负载因子和扩容开销、递归的最大深度估算、原地修改是否会污染输入、是否依赖输入有序。这些细节平时不做记录面试被问到就只能临场瞎猜。边界条件的记录我用一个固定清单挨个过空输入、单元素、全相同元素、已排序或逆序、含负数、含零、极值最大整数、最小整数、重复元素、目标不存在。不是每道题都全中但每次都要过一遍这个清单久而久之会形成条件反射看到题就自动想到这几个方向。3.3 代码模板怎么沉淀以滑动窗口和二分为例模板不是抄来的是自己压缩出来的。压缩的标准是把所有题里相同的骨架抽出来把不同的部分留成空位。我举两个我最常用的。滑动窗口的骨架长这样def sliding_window(arr): left 0 state {} # 窗口内的统计状态 best 0 # 按题目定义最长/最短/计数 for right in range(len(arr)): # 1. 右指针进入更新 state state[arr[right]] state.get(arr[right], 0) 1 # 2. 判断窗口是否违规违规就收缩 while is_invalid(state): state[arr[left]] - 1 if state[arr[left]] 0: del state[arr[left]] left 1 # 3. 此刻窗口合法更新答案 best max(best, right - left 1) return best这个骨架里只有is_invalid和更新答案那两行是变量其余全部固定。我把它存在模式总览里做题时只填空位。这样做的直接好处是面试时手不会抖因为骨架已经写过上百遍肌肉记忆覆盖了语法细节大脑可以全部用来想业务逻辑。二分模板我用的是左闭右开的那一版因为它能统一处理找第一个满足条件的位置和找最后一个满足条件的位置两种情况def lower_bound(arr, target): lo, hi 0, len(arr) # 区间 [lo, hi) while lo hi: mid lo (hi - lo) // 2 # 防溢出写法 if arr[mid] target: lo mid 1 else: hi mid return lo # 第一个 target 的位置mid lo (hi - lo) // 2这个写法看着啰嗦但它避免了lo hi溢出是一道必踩的坑留下的痕迹。这类细节一定要写进模板注释里因为你自己半年后也会忘。注意模板只保存骨架不要保存某道具体题的完整解法。具体解法放进题解文件。模板文件一旦混进具体逻辑就会迅速膨胀成第二个题库失去查阅价值。3.4 反例与踩坑记录最容易丢分的那几个细节我在题解里专门留了一个坑字段记录这道题上我实际踩过的错。这个字段的写法有讲究必须写我当时写成了什么、为什么会错、正确的应该是什么不能只写注意边界。举几个高频的。整数溢出中间计算用 32 位会溢出尤其是求中点、求乘积、求累加和的时候。闭开区间混用二分的hi到底是len还是len - 1循环条件是还是改了一处忘了改另一处就会出现死循环或者漏掉最后一个元素。重复元素去重逻辑写在循环外还是循环内跳过的是当前元素还是下一个元素这类细节在回溯和双指针里翻车率极高。原地修改污染输入有的题要求不能改原数组有的题允许做题时先确认清楚别默认可以改。还有一类坑更隐蔽题意理解偏差。比如子数组和子序列是两回事至少 K 个和恰好 K 个完全不同返回下标和返回值要看清。这类问题我在题解里会单独标一行题意关键用一句话复述题目要求防止下次再看时又想当然。4. 汇总与索引让题解从散落笔记变成可检索系统4.1 目录结构设计三层就够别搞太深目录结构的原则是任何一份题解从根目录出发最多点两次就够到。超过三层你就懒得找了懒得找就等于没写。我的结构是这样题解汇总/ ├── 00_索引/ │ ├── 主表.md # 模式-题号-掌握度-复习日期 │ ├── 模板速查.md # 所有代码骨架 │ └── 坑位清单.md # 按错误类型聚合的踩坑记录 ├── 01_数组与双指针/ │ ├── 模式总览.md │ └── 题解/ ├── 02_滑动窗口/ ├── 03_二分查找/ ├── ... └── 99_归档/关键设计有两个。第一索引单独放一层并且放在最前面00 开头因为它是你每天打开频率最高的文件必须一眼能看到。第二题解文件不按题号命名按模式关键特征命名比如滑动窗口_最短覆盖子串.md。按题号命名的问题在于你复习时想找的是模式不是数字脑子里根本没有那个号。坑位清单.md这个文件我想单独说一下。它不是按题归档是按错误类型归档。比如二分边界这一类下面会列出所有我在二分边界上翻过车的题号每条一句话说明错法。这个文件的价值在于面试前半小时翻一遍能把最容易犯的错集中回忆起来比翻十份题解有效得多。4.2 标签体系与交叉索引光有目录还不够因为一道题往往横跨多个模式。比如一道题可能既是滑动窗口又是哈希计数只看目录会漏掉。所以我给每份题解加了一行标签格式是#模式 #数据结构 #技巧 #难度。标签的作用是支持反向查找。当我在某次面试里被问到一个用堆维护中位数的问题我可以直接搜#堆这个标签把所有相关题解拉出来而不是去回忆它在哪个文件夹。这份汇总用纯文本管理标签就是普通的井号词靠编辑器的全局搜索来用不需要任何复杂工具。交叉索引我还有一个笨办法但很有效在模式总览里维护一个相似题区块把容易混淆的几道题列在一起写清楚它们的区别在哪。比如求最长和求最短的滑动窗口代码骨架几乎一样但收缩时机和答案更新时机完全相反这两个放一起对比一次就能记住。4.3 用一张主表维护模式-题号-掌握度-复习时间这张表是整套体系的中枢。没有它你不知道该复习什么有了它每天打开看一眼就知道今天该干哪些题。表的结构是这样模式代表题简述掌握度上次复习下次复习备注滑动窗口最长无重复子串303-1203-26骨架稳注意空串滑动窗口最短覆盖子串103-1203-15收缩条件总写错二分查找第一个满足条件的位置303-1003-24模板已固化二分查找答案空间二分分割数组003-1403-15完全没思路重点动态规划背包求方案数203-1103-18初始化容易漏掌握度用 0 到 3 四档。0 是完全没思路看到题不知道怎么下手1 是有思路但写不对知道用什么模式代码跑不通2 是能写对但慢需要看笔记或者耗时超过三十分钟3 是闭卷二十分钟内一次通过。这个分档看起来很粗但它足够支撑决策复习优先级永远是 1 和 02 每周过一遍3 每月抽查。复习时间的计算用的是间隔重复的思路但做了简化。掌握度 0 和 1 的题间隔一天和三天掌握度 2 的题间隔一周掌握度 3 的题间隔两周到一个月。每次复习后根据当次表现重新打分分数变了间隔就跟着变。这套规则不需要任何软件手写表格或者纯文本都行关键是每天真的要打开看。5. 复习节奏与实战检验汇总到底怎么用起来5.1 三轮复习的时间分配题解写完了不等于会长复习才是把知识压进长期记忆的环节。我的复习分三轮节奏是 T1、T7、T30。T1 这一轮只做一件事闭卷重写代码。不看题解从零开始写写完再对照。这一轮的目标不是理解是暴露遗忘。大部分人这一轮的正确率只有五成左右很正常。写错的题当场看题解重点看第二段思路推演看自己当时是在哪个岔路口走偏的。T7 这一轮做的是模式串联。不再单题复习而是把一个模式下的所有题拉出来先看模式总览然后随机抽两道写。这一轮的重点是识别能力——我会让自己只看题目描述的前两句就判断出该用哪个模式判断错了说明抽象没做到位。T30 这一轮是查漏。只复习掌握度低于 3 的题以及主表里备注栏有特别标注的题。这一轮花的时间最少通常一两个小时能过完全部遗留问题。时间分配上我大概是这样日常刷题和写题解占七成时间T1 复习占两成T7 和 T30 合起来占一成。这个比例很多人会觉得复习占比太低但实际执行下来写题解本身就已经包含了大量复习成分——你写第二段思路推演的时候实际上是在做一次深度复盘。5.2 模拟面试里怎么调用这份汇总到了面试前两周复习方式要切换。这时候不再追求覆盖面而是追求表达质量。我会做模拟面试具体做法是从主表里随机抽五道掌握度 2 以上的题对着空气讲讲的时候必须包含四件事——这道题考什么模式、暴力解法是什么复杂度、最优解的关键洞察在哪、边界怎么处理。全程不看题解讲完再对照。这个练习暴露的问题非常真实。很多人代码写得出来但讲不清楚为什么。比如这里用哈希表是因为需要 O(1) 查询这句话背后其实是如果用数组需要 O(n) 扫描会退化面试官往往追问的就是后面这半句。而这些补充论证恰好就写在我题解的第五段坑与变式里。所以模拟面试的正确用法不是重新做题而是把自己写的题解当讲稿练到能脱稿。手写代码这一环也要单独练。平时在编辑器里有自动补全、有语法高亮白板或者纯文本环境下会各种不适应。我一般用最朴素的文本编辑器手写不给自己任何提示写完再跑测试。这个训练做上十几次面试时的手感会完全不一样。5.3 面试后的回填机制这是最容易被忽略的一环但价值极高。每场面试或笔试结束后二十四小时内必须回填。回填的内容不是今天考了什么题而是三个问题哪道题我没做出来卡在哪一步哪道题我做出来了但讲得不好哪道题我在题解里明明记过但现场没想起来。第三个问题是最有价值的。如果一道题你记过题解但现场没调出来说明你的索引失效了——可能是标签打错了可能是模式归类归错了也可能是那道题的题解写得太长复习时根本没看进去。找到原因当场改索引比再做十道新题有用。回填还有一个副产品它会不断修正你的核心清单。我发现有些模式在实际面试里出现频率远高于我的预期有些我以为很重要的模式反而很少被问。这些观察持续几个月清单的权重就会越来越准。这种校正只能靠真实反馈靠猜是猜不出来的。6. 常见问题与排查清单6.1 高频问题速查表下面这些是我在维护这份汇总的过程中反复遇到的问题整理成表方便对照。现象大概率原因处理办法题解写了很多但从不回看文件太深、命名不可搜索引提到最前层改按模式命名复习时看不进去自己的题解第二段思路推演写得太跳补上我当时卡在哪的过程描述同类题反复错同一个点坑位没有按错误类型聚合建坑位清单.md按错误类型归档题量上去了但新题还是没思路缺少模式总览这一层每个模式补一页总览写触发条件模板记不住每次现推模板里混进了具体题逻辑抽纯骨架变量留空位复习计划坚持不下去每天排的题太多每天只排三到五道宁少勿多掌握度打分不准打分标准太主观严格用闭卷二十分钟一次通过卡 3 分6.2 我实际踩过的几个坑第一个坑是过早追求体系完整。我第一版汇总花了两周时间设计目录、配色、命名规范结果一道题没写。后来想明白了这套东西的价值全在内容格式只要能用就行。现在的版本是纯文本加三个索引文件丑得要命但好用。第二个坑是题解写成了答案复制。早期我的题解里代码占了八成篇幅思路只有一句话。这种题解复习时完全没用因为代码你随时能查到缺的是思路。后来我把规则改成思路段的字数不得少于代码段的注释数强行逼自己写思考过程。第三个坑是只记录成功路径。我一度只给做出来的题写题解做不出来的直接跳过。结果就是最难的那批题永远没有记录也永远不会被复习到。现在的规矩是做不出来的题优先写写的时候重点记录我卡在哪、正确的切入点是什么。这类题解的价值远高于顺利做出来的那些。第四个坑是复习频率定得太高。一开始我给自己排了每天复习十道题的计划坚持了四天就崩了。人对自己执行力的估计普遍偏高。后来砍到每天三到五道反而稳定跑了半年多。计划能不能持续比计划本身精不精妙重要一百倍。第五个坑是没有淘汰机制。清单只进不出一年后膨胀到四百多题复习一遍要两周等于废掉。现在每个月做一次清理连续两次满分且没有新变式的题直接归档清单维持在一百二十题左右。最后一个体会也是我做了这么久最想说的一句这份汇总的价值不在于它有多全而在于它有多你。网上现成的题单和模板到处都是但那些东西不解决你的具体问题——你不知道自己在哪个岔路口走偏也不知道自己反复栽在哪类边界上。这些只能靠一份自己一行一行写出来的记录慢慢积累。我从最早的三百道题只留下六道有效记录到现在一百二十题能覆盖大部分面试场景靠的不是刷得更多是每一道题都被真正消化了一次。你如果刚开始搭别贪多先挑一个模式把那个模式下的五道题按五段结构写完写完你就知道这套东西对你有没有用了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询