1. 刷题笔记的正确打开方式:从记录到复盘
先说个扎心的现实:很多人刷题就是打开题库、看题、想了十分钟、没思路、看题解、恍然大悟、关掉页面,过两天再遇到同类型题目,大脑依旧一片空白。这种“眼睛会了手不会”的状态,几乎每个刷题人都经历过。我自己也踩过这个坑,一直到后来改变笔记策略,才真正把刷题变成了可积累、可复用的资产。
这篇笔记记录的是我近期刷题过程中沉淀下来的一套做法,顺手把踩过的坑和优化思路都整理出来。如果你也是那种刷了两百题还是觉得没底、看到新题就发慌的状态,那这套笔记方法论应该能给你一点启发。题海战术从来不是核心,核心是你有没有把每一道题吃透,而吃透的标志,就是你能不能写出那份属于自己的刷题笔记。
先说结论:一份合格的刷题笔记,至少要包含三块内容——题目背后的考点拆解、你自己从不会到会的完整思考链路,以及一类题型通用的解题模板。缺了任何一块,笔记都只是题解的搬运工。后面我会一步步展开讲,这三块分别怎么做,为什么非做不可。
这份笔记适合谁?非常适合准备面试、考研机试、算法竞赛入门,或者纯粹想提升代码功底的人。不管你现在刷的是数组、链表、二叉树还是动态规划,思路都通用。区别只在于不同知识点的抽象程度不一样,记录的方式要做微调,这一点我会在后面的章节单独讲。
2. 刷题前必须想清楚的三件事
2.1 你刷题到底是为了什么
这个问题听起来很废话,但实际操作中我发现,刷题目标不同,笔记的写法完全不同。
如果你是为了应付面试,那笔记的重心应该是“高频题型”和“白板代码熟练度”。你不太需要去抠最刁钻的数学证明,而是要保证拿到题能快速定位考点、写出干净无 bug 的代码、讲清楚复杂度。这时候笔记里就应该多记录题目的常见变形、面试官可能追问的方向。
如果你是为了竞赛,那笔记的重心就变成了“算法套路库”。竞赛题很多是复合考点,一道题里同时考察数据结构、数学推导和边界处理,笔记里需要把每一层拆开,记下当年自己在推导过程中卡住的位置,以及这个卡点对应的突破口。
如果你只是普通的技术提升,那笔记更偏向于“理解型”。你可能不需要高频刷题,但每道题都值得深挖,把原理和直觉打通。这种笔记会偏长,但写完后你对一类题型的理解会非常通透。
我自己经历下来,最怕的就是目标混乱。今天为面试刷题,明天又转去死磕竞赛题,笔记风格来回跳,最后两边都做不好。建议你动手写第一篇笔记前,先花十分钟想清楚自己的目标,然后就不要随意摇摆。
2.2 刷题量多少才算够
相关热词中“题”字出现频率很高,说明很多人都卡在数量焦虑上。我也曾经立过“每天五题”“刷满五百题”这种 flag,后来发现纯粹是自欺欺人。有些题刷了就忘,有些题刷三遍还是记不住,数量堆上去除了自我感动,没有太大意义。
我个人的经验是,把刷题量分成三层来对待。第一层是入门熟悉期,大概五十题左右,目的是熟悉常见的数据结构和基础算法,这个阶段可以追求覆盖面,尽量多接触不同类型的题目。第二层是专题突破期,按知识点分模块刷,比如动态规划刷四十题、二叉树刷三十题,这时候不要追求数量,而是把一个类型的题吃透再进入下一个类型。第三层是模拟冲刺期,按真实场景做套题训练,检验自己能不能在限时环境下稳定输出。
你可以算一笔账:假设你计划用三个月准备面试,前一个月是熟悉期,中间一个月是专题期,最后一个月是冲刺期,那么总量大概在一百五十题左右。这个数量不算夸张,但如果每一题都认真写笔记、做复盘,效果远好过囫囵吞枣刷五百题。
2.3 笔记工具怎么选
工具选择这件事我折腾过很久,从纸质笔记本到各种笔记软件都用过。最后沉淀下来的组合是:本地用 Markdown 编辑器做主力笔记,配合版本管理工具做归档,再用一个轻量的网页工具画思路图。
为什么最终选择 Markdown?因为刷题笔记里大量涉及代码块、数学公式和列表结构,Markdown 的纯文本特性让这些内容非常干净,而且方便检索、方便迁移。你可以随时把一篇笔记转成 PDF 分享出去,也可以在整个笔记库里面做全文搜索,效率远高于纸质笔记。
选工具时要避免一个误区:不要在笔记美化上花太多时间。有些笔记软件支持各种主题、标签、数据库、双链,功能很强大,但也非常容易让人沉迷于“装修笔记”而忽略了真正的思考。刷题笔记的核心价值是记录你的思考过程,不是做一份精美的知识管理演示文稿。工具能用就好,把省下来的时间花在解题和复盘上面。
3. 单题笔记的五个核心段落
3.1 题面和考点的重新表述
很多人记笔记时习惯把原题直接粘贴进去,然后写个题解代码就是一篇笔记。这个做法我觉得意义不大,因为粘贴过来的题面是别人的语言,你的大脑没有真正参与加工。
更好的做法是,看完题之后先把页面关掉,用自己的话把题目重写一遍。重新表述的过程会强迫你理解题目的输入输出、数据范围,以及真正要求解的问题是什么。如果你能把这个表述写清楚,说明你已经看懂题了;如果你写出来的表述模棱两可,那你大概率还没抓住核心。
重新表述之后,再写下这道题的考点标签。比如“数组 + 双指针”“哈希表 + 滑动窗口”“树形 DP”。第一次写标签你可能只会写“数组”“字符串”这种粗粒度标签,没关系,刷多了之后你会慢慢学会更精确的标签,比如“同向双指针”“原地哈希”“单调栈维护区间”。标签越精确,后续复习时定位越准。
考点标签的作用在复习时非常明显。比如你打算复习“滑动窗口”这个模块,直接搜索笔记库里的标签,所有相关题目一次性列出来,比你在题库里一题一题翻要高效得多。
3.2 你的思考路径记录
这一部分是我认为整篇笔记最值钱的地方,也是绝大多数人最容易忽略的地方。
很多题解文档里只有“解法 + 复杂度 + 代码”,看起来很标准,但对你自己的提升很有限。你需要记录的,是你在拿到这道题之后,脑子里的完整活动路径:
- 看到数据范围,第一反应是什么?
- 第一次想到的解法是什么?为什么觉得可以?最后为什么放弃了?
- 卡住的时候卡在哪个点?是边界条件想不清楚,还是状态转移方程推不下去?
- 看了题解之后,哪一句话让你豁然开朗?
- 你和题解之间的思维差距到底在哪里?
这些内容写起来很琐碎,但它们是你思维的真实切片。每当你复习这道题时,看着这份记录,你会清晰地看到那条从“不会”到“会”的路径。更关键的是,很多题卡住的本质原因是一样的,记录多了之后,你会发现自己反复在同类地方翻车,这时就可以针对性地做专项强化。
我见过一种挺有效的记录方式,把思考路径写成两列对比:左边是“我原来的想法”,右边是“正确的思路”。中间用一句话点出关键转折。这个格式看起来很朴素,但复盘时一眼就能找到自己的问题所在。
3.3 核心解法拆解与复杂度分析
写解法时不要只写代码,要把解法拆成相对独立的步骤,每一步说明它到底在解决什么问题。比如一道经典的“两数之和”,表面上是哈希表存补数,但背后其实是一个“空间换时间”的经典思想:把查找时间从遍历降为哈希查询。
复杂度分析不能只写一个“O(n)”,你得能解释清楚:为什么是 O(n)?空间 O(n) 体现在哪?有没有办法把空间复杂度降下来?代价是什么?这些追问会推动你从“背模板”走向“真正可控”。
我自己的习惯是,每道题至少追问一个复杂度优化方向。如果一道题的标准解法是 O(n) 空间,会想一下有没有 O(1) 空间的版本?如果需要排序预处理,那排序本身对复杂度的影响是什么?这些额外思考不一定每次都有结果,但思考过程本身就是一种训练。
3.4 代码实现与细节坑位
这一步把你最终验证通过的代码粘贴进来,但不要整段贴完就结束。你要把代码里那些容易写错、容易踩坑的位置单独拎出来,加注释说明。
举几个我自己常见的坑位类型。一个是循环边界,比如二分查找里left和right的取值到底是互斥还是包含关系;另一个是数据溢出,比如乘法中间结果会不会超出类型上限;还有一个是空值判断,比如链表题里空链表、单节点链表的边界处理。
这些细节单独提取出来写,是因为它们具有极强的复用价值。你踩过的边界坑,很可能换一道题还会踩。把这些细节整理成清单,做题前后对照一下,能有效降低错误率。
另外建议给每段代码标注“本题关键代码”和“可复用模板代码”。关键代码是跟这道题强相关的部分,可复用模板则是那些抽出来之后能用到其他题目里的骨架,比如二叉树的递归遍历框架、二分查找的通用框架等。随着笔记数量增加,你会逐渐积累出自己的代码模板库。
3.5 同类题的横向对比
一道题做完,如果你能找到两三个同类题进行对比,那就开始建立知识网络了。把这几道题放在一起,比较它们的相同点和差异点,提炼出解决这一类问题的通用框架,比单纯多刷几道题有价值得多。
举个例子,你连续刷了“接雨水”“最大矩形”“柱状图中最大的矩形”这一组题,会发现它们都涉及到“找边界”这一核心操作,区别只是用单调栈维护的索引信息不同。你可以在笔记里画一个小表格,把题目、数据范围、核心数据结构、遍历方向列出来,一眼看清这一类题的演化脉络。
横向对比还能帮你发现自己对某个知识点理解不够深入。比如你对比后发现,几道所谓不同类的题目实际上都能转换成同一种模型,那说明你对模型的抽象程度还不够。继续深挖下去,你对一类问题的理解就会从“会做某几道题”上升为“掌握这一类模型”。
4. 按知识点整理的分类笔记法
4.1 为什么要做分类笔记
单题笔记解决的是“这道题怎么做”,但如果只停留在单题笔记,你的知识结构会是碎片化的。今天刷一道数组题,明天刷一道图论题,彼此之间没有联系,遇到综合题就抓瞎。
分类笔记的价值在于,把散落的单题笔记按照知识点重新组织,形成所谓的“题单”或“专题”。每一类知识点下面,你可以汇总相关的题、相关的模板、相关的易错点,形成一个完整的知识块。
这个做法本质上是在给自己的大脑做外挂。你不需要把所有解法都记在脑子里,你只需要记住每个知识点的导航结构:这个知识点下面有哪些题、核心框架是什么、常见的坑在哪里。做题时调取到对应知识点,再从记忆里把细节展开。
我建议至少给这些高频考点建分类文件夹:数组与指针、哈希表、字符串、链表、栈与队列、树与二叉树、图、搜索回溯、动态规划、贪心、二分、数学。某些类型里题目特别多的,比如动态规划,可以再拆成线性 DP、背包 DP、区间 DP、树形 DP 等子类。
4.2 分类笔记的整理节奏
分类笔记不建议一次集中整理,而是建议“每次刷完题后顺手归档”。刷完三道动态规划的题,就把这三道题的链接和核心解法更新到动态规划分类下。这样你的笔记库始终保持着热度和连续,不用等复习时一次性面对堆积如山的素材。
我自己的节奏是:每天刷题结束后,用十五分钟做归档动作。把当天的单题笔记更新到对应分类,检查一下分类里有没有内容重复的条目,顺手把一些过时的链接修正掉。别小看这十五分钟,坚持一个月后你的笔记库会非常齐整。
每周再做一次整体检视。打开每个分类文件夹,看看哪些分类内容特别少、哪些分类内容乱糟糟的。内容特别少的分类要么说明你知识点覆盖不够,要么说明这个分类的题目定义得过细了,需要合并。内容乱糟糟的则说明归档不及时,需要重新梳理。
4.3 分类之间的关联建立
分类之间不是孤立的。刷到后面你会发现,一道题往往是几个知识点的综合体。这种时候,单题笔记的标签就派上用场了。你可以在分类笔记里做交叉引用,比如在树的分支里刷到一道题,解法核心其实是“树的遍历 + 哈希表”,那就同时在树和哈希表两个分类里留下对应记录。
这种交叉做法一开始会显得繁琐,但当你复习时能体会到巨大优势。你想复习哈希表,能同时看到数组和树的哈希应用;你想复习树的遍历,又能看到某些哈希题里隐含的树模型。
还有一点值得做:每个分类的头部写一段“知识地图”。不是详细解法,而是用几句话概括这个知识点的核心思想、典型题型的识别特点、易错点和常见复杂度。这段知识地图你可以随着刷题不断修订。它对你快速定位题目、建立全局观帮助极大。
5. 刷题记录里的复盘与迭代
5.1 二刷三刷时的对比
刷题笔记不是写完就锁死的,它应该是活文档。你会反复刷同一道题,每次的笔记都值得追加记录。
二刷时重点看什么?看第一遍写下的思考路径,看当时卡在哪儿,看第二次能不能不看题解直接顺利做出来。如果你第二次依然卡在同样的点上,说明这个题目对应的知识点还没掌握牢,需要回到分类笔记里重新学习核心框架。
三刷时重点就是熟练度和加速度。能不能快速识别出考点,能不能直接写出可运行的清爽代码,能不能一眼看出边界条件的坑。如果你能稳定做到这些,这道题就可以从你的“重点复习列表”移动到“已完成列表”。
很多人的误区是一道题只刷一遍,然后刷够数量就去换新题。但我个人的体会是,一道高质量题目做三遍,比做三道类似的题收获要大。第一遍建立认知,第二遍巩固框架,第三遍形成肌肉记忆。三遍之后这道题才真正成为你的东西。
5.2 周度和月度复盘怎么做
复盘是笔记方法中最后一个关键环节。没有复盘,你积累的笔记就只是一堆安静的 Markdown 文件。
周复盘建议围绕三个问题展开:这一周刷了多少题?有几道题第一次就能顺利做出来?有几道题反复看了多次题解才搞明白?把这三类数据记录在周复盘笔记里。连续记录几周后,你能看出自己的学习趋势,是渐渐变好还是在原地打转。
月度复盘做得更粗粒度一些:这个月的整体进度如何?计划完成了吗?如果没完成,是刷题量安排过重,还是某个知识点花了超出预期的时间?下个月需要调整的方向是什么?
复盘的输出物不要求精美,哪怕只是几条要点也行。它的价值在于强迫你跳出逐题刷的状态,从一个更高的视角观察自己的学习过程。没有复盘,刷题很容易变成体力劳动;有了复盘,刷题才会变成智力投资。
5.3 如何面对刷不下去的瓶颈期
刷题遇到瓶颈太正常了。连续几天状态差、题目刷不动、思路打不开,几乎人人都会经历。这时候笔记能帮你做的事,是让你看到自己过去的进步曲线。
当你觉得这周特别挫败时,翻一翻几周前的笔记,看看当时的自己连这道“简单题”都搞不定,而现在能做中等难度的题了。这种对比带来的信心,比灌鸡汤有用得多。
瓶颈期还有一个很常见的成因:基础知识不牢,被题目中隐含的前置要求卡住了。如果你刷回溯时反复卡壳,大概率是递归基础不够扎实。这时候不要硬刚难题,退回分类笔记,重新刷一遍递归相关的入门题,把基础补上再来挑战。这个回退动作特别重要,永远不要觉得刷简单题是浪费时间,有时候慢才是快。
另外我还会在瓶颈期做一件有意思的事:随机挑一个已经完全掌握的旧题,不看代码重新手写一遍。这个动作能帮你找回顺畅的做题感觉,快速恢复信心,而且能检验你的记忆是不是停留在“看懂了”而不是“会写了”。
6. 笔记库的维护与工具链整合
6.1 多端的同步与备份
刷题笔记有一个特点:你会在地铁上、电脑前、咖啡馆里等不同场景随时产生灵感。所以笔记的同步和备份很重要。
我的方案是使用支持命令行操作的 Markdown 笔记库,配合一个网盘同步目录。笔记库本身用版本管理工具建档,每次修改提交一次,网盘负责跨设备实时同步。这样既能保证修改记录完整可追踪,又能让手机端和电脑端内容保持一致。
这个方案的备份安全性也很好。网盘做一份备份,版本管理仓库远程再做一份备份,双保险。即使本地磁盘挂了,也能快速恢复全部笔记。刷题笔记是你长期投入的心血,不能因为一次硬盘故障就全部归零。
如果你对命令行工具不熟悉,也可以用带同步功能的笔记软件,核心原则一样:支持 Markdown、支持全文检索、支持多端同步、支持历史版本。满足这四点,工具选什么就是个人喜好的问题了。
6.2 检索与复习的调用方式
笔记库只有能快速检索,才有复习价值。Markdown 全文检索能帮你做到跨所有笔记的内容搜索,这比在纸质本里翻页找内容高效太多。
常用的检索场景有几个:按标签搜题目、按关键词搜算法名、按分类目录浏览某一类题型。这些操作本质上都是查笔记库中的某一类资料,区别是颗粒度不同。刷题前可以快速搜一下这个知识点下自己做了哪些题,加深对已有知识储备的印象;复习时直接按分类章节完整过一遍。
复习时我还习惯给每篇单题笔记加一个状态标记:未掌握、熟悉中、已掌握。搜索时按状态筛出“未掌握”的题,这部分就是你最需要投入时间复习的清单。每次复习完成后更新状态标记,慢慢地把“未掌握”清单清空。
6.3 阶段性输出与分享
笔记做到一定规模后,试着输出一些阶段性总结。比如写完动态规划专题后,输出一篇《我如何刷完三十道动态规划题》的总结文章。这个动作会把你的零散笔记系统化,因为输出时需要重新组织逻辑顺序、提炼核心结构,是种极好的二次学习。
输出总结时不需要追求面面俱到,你可以只挑你体会最深的三到五个点展开。比如对你冲击最大的一个思维转换、你最容易犯的一个错误、你总结出的一个解题模板。这些内容因为来自真实实践,写出来会非常有份量,对他人也有实际参考价值。
分享渠道随意,博客、社区、技术论坛都行。有人反馈当然好,没人反馈也没关系,写总结本质上是写给自己的。我的体会是,每一次阶段性输出之后,我对相关知识点和笔记库结构的理解都会更上一层台阶。
7. 常见问题速查与避坑心得
7.1 刷题笔记常见问题速查表
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 笔记成了题解搬运 | 记录里只有题目和标准代码,没有自己的想法 | 强制要求自己重写题面、记录思考路径,哪怕写得很粗糙 |
| 笔记写完不复看 | 笔记本越积越多,但从不回去翻 | 设置每周固定复盘时间,基于状态标记筛出“未掌握”题目 |
| 分类混乱 | 同一个知识点分散在多个文件夹,搜索也搜不全 | 每周做一次归档检查,把新题归入对应分类,统一标签规范 |
| 只记单题不总结 | 做了很多题,但提取不出通用的解法模板 | 每做完一类题,强制建一个专题笔记,写该类型的通用框架 |
| 笔记里全是代码 | 代码照搬标准题解,算法思想完全没记录下来 | 每段代码补充说明它解决什么问题,以及代码里的关键坑位 |
| 过度追求排版 | 时间花在调整格式上,真正思考时间反而少 | 接受“先粗糙后完善”,优先记录思考过程,排版放在复习前统一调整 |
7.2 几个容易被忽略的细节
第一个细节:数据范围一定要记录。刷题时你看到的每个数据范围都是有意义的信息。n <= 10可能暗示暴力搜索,n <= 10^5说明时间复杂度得控制在 O(n log n),n <= 10^9基本排除线性解法。把数据范围写在笔记开头,下次复习时能快速回忆起复杂度约束条件。
第二个细节:状态转移方程不只是写出来,要注释每一步的意义。很多动态规划笔记里写着dp[i] = max(dp[i-1] + nums[i], nums[i]),但完全不解释dp[i]代表什么。建议每次写方程时,都把下标含义、初始化值、遍历顺序三个内容用文字写清楚。我见过太多人抄对了方程却不理解含义,换一道变体题就直接歇菜。
第三个细节:代码里的中间调试过程也值得留一点记录。很多人刷题时跑出错误结果,会不断加打印语句来排查。这些调试过程虽然看起来不正式,但记录下“这里我以为是边界问题,调试后发现是初始化顺序错了”,能让后续复习时非常快速地避开同类错误。
7.3 几个实用习惯
习惯一:每天固定时间刷题。我一般在晚上精力相对集中的时段刷题,刷完十五分钟整理归档。这个节奏坚持下来之后,身体和精神会形成惯性,到点自动进入状态。
习惯二:每道题给自己定一个“思考截止时间”。新手可能二十分钟,熟练后缩短到十分钟。时间到了还没有思路就直接看题解,但要完整记录下自己卡住的位置。这个习惯能防止你在某道题上无限地死磕,保证刷题节奏持续推进。
习惯三:偶尔手写代码。不是用笔写在纸上那么夸张,而是打开一个空白编辑器,不依赖自动补全,不复制自己以前的代码,纯靠记忆敲完整个解法。这能极好地检验你是否真的掌握了代码框架,尤其是面试场景下白板写码的朋友,一定得多练这个动作。
8. 个人体会与小技巧分享
写到这里,按我的习惯分享几个从实践中沉淀出来的小技巧。
第一个小技巧:刷题笔记的模板不要固定死,周期性地调整。我刚起步时的模板很简单,只有题面、代码、复杂度。刷了三十题后觉得不够用,加了“思考路径”板块。又刷了一阵子发现“横向对比”特别重要,于是模板进化成现在的样子。模板越用越顺手,不要怕折腾,适合你当前状态的模板才是好模板。
第二个小技巧:去观察别人优秀笔记里那些让你“眼睛一亮”的段落。我每隔一段时间会去刷一些公开的题解和总结文章,不是为了抄题解,而是为了看别人怎么组织思路。看到好的表述方式,我会顺手记下来,改造后用到自己的笔记里。比如我现在笔记里常用的“卡点回顾”就是一种从别人题解里学来的结构。
第三个小技巧:千万别把笔记变成收藏夹。看到一份优秀总结就整个存下来、收到笔记库里,这种动作显然很爽,但绝大多数时候你存完就不会再看一眼。真正有效的做法是:把别人的总结压缩成几句自己的话,记在相关的分类笔记下面。经过你的语言系统重新编码过的内容,才是真正被消化过的内容。这一步虽然花心思,但也是拉开差距的关键。
刷题笔记没有标准答案,不同阶段的人适合不同的方式。我自己也是从最原始的“粘贴题解”一步步调整到现在的这套方法的。你能坚持刷题、愿意做记录,就已经跑赢大多数人。剩下的只是迭代和优化的问题。找到自己舒服的节奏,持续更新这套笔记系统,你的刷题投入会越到后期越显价值。