这里在牛客上刷题第 5 篇记录。第 5 篇这个位置挺有意思,一方面是基础语法、经典数据结构已经过了几轮,很容易进入"一看题就会、一提交就卡壳"的状态;另一方面也差不多到了该总结方法论的时候。刷题进度过半之后,真正有用的不是又做了多少道新题,而是把前面的题、错过的提交、看过的题解,重新回炉一遍,看看自己到底在哪些环节上反复消耗。
这篇记录不是一个标准答案,就是我自己第 5 轮刷题的真实复盘。我会把这一轮遇到的几道题、踩过的坑、解题过程中琢磨过的思路,以及我后来调整的刷题节奏,都摊开来说。文章后半部分还会专门聊聊"怎么记录刷题记录"这件事,这也是我从第 1 篇写到现在最大的心得体会。
1. 为什么需要"刷题记录"这件事
很多人刷题不记笔记,刷一道忘一道,过两周回头一看,跟没刷一样。我第 1 篇到第 3 篇其实也这样,基本靠"我好像见过这题"的模糊印象撑着。真正让我改变的是第 4 篇时做了一套模拟卷——有一道题我清清楚楚记得自己在某个讨论区见过,但就是写不出来完整解法,那一刻就很受触动。
刷题记录最重要的作用不是"证明自己刷过",而是为自己建立一个可检索的错题和思路库。人脑的记忆是不可靠的,尤其是算法题这种知识点密集、套路繁多的事项。一道二叉树的遍历题,三个月后你只会记得"哦我刷过",但具体是递归还是迭代、有没有剪枝条件、边界怎么处理的,全都模糊了。如果我们每次刷完题花十分钟做一次记录,把题目类型、解题思路、复杂度、关键边界写下来,三个月后翻到这条记录,5 分钟内就能把思路捡回来。
**我现在的记录方式很简单:每道题一个固定格式,包含题目类型、核心考点、我的思路、第一次提交的错误点、最终通过的解法、复杂度分析、同类题链接。**格式固定下来之后,记录速度会快很多,而且回看的时候信息密度很高,不会出现"我当时写了啥"的尴尬。
另一个层面的意义,是这些记录能暴露出你的薄弱环节。我在整理第 4 篇的记录时发现,动态规划的题目我记录了 12 道,但每一道都是"看了解答才写出来"。这个模式单看某一题不明显,放在一起就非常清晰——不是我把 DP 学好了,而是我一直在做"听懂了"的假练习。这种问题,不做记录根本发现不了。
还有一点,记录的过程本身就是二次学习。你在写"为什么这个状态转移方程是这样"的时候,比单纯敲代码多了一次深度思考。很多我当时以为自己懂了的题,都是在写记录的时候想明白的。所以如果你问我刷题要不要做记录,我的答案永远是:一定要,而且要尽早开始。
2. 第 5 轮刷题的内容范围与选题策略
进入第 5 轮之后,我不再是"今天打开牛客就随手做一道",而是给自己定了一个相对明确的选题策略。刷到这个阶段,单靠题量堆积的收益已经明显递减了,重要的是把不同类型的题目按专题过,形成体系化的理解。
我给自己定的原则是这样的:
- 优先巩固已经学过但不够扎实的专题,比如动态规划、字符串处理;
- 适当穿插一些"冷门"的知识点,比如位运算、前缀和,这些在面试中出现的频率不如二叉树高,但一旦出现,区分度很大;
- 刻意训练"一题多解",同一道题至少想两种解法,并对比它们的适用场景。
这段时期我主要刷了以下几类:
字符串与模拟类。这类题看起来简单,实则非常容易出错。尤其是涉及索引、边界、连续字符处理的题,稍不注意就数组越界或者结果差一个字符。我明显感觉,这类题在写得快的时候错误率反而高——因为"觉得简单"之后往往会跳过手动推演,直接在编辑器里开写,然后被边界条件教做人。
动态规划进阶。第 4 轮记录暴露了 DP 的问题后,这一轮我花了大量时间在 DP 上。不再满足于"递推公式对不对",而是刻意练习从"暴力递归"到"记忆化搜索"再到"状态压缩 DP"的完整推导链。虽然做题速度变慢了,但理解深度明显上了一个台阶。
链表与指针操作。这类题在牛客上几乎是必刷的,每轮我都会选几道练手。链表的题特别适合用来训练"画图理解"的习惯,因为指针指向的变化光靠脑子想很容易出错,一画图就全清楚了。
我还刻意加入了寻找规律类的题目。这类题不考具体的算法模板,更考验观察力和数学直觉,往往答案出来以后会觉得"原来这么简单",但过程中很可能卡很久。这类题我建议刷题到中期以后一定要适当接触,它能帮你跳脱出"套模板"的思维定式。
3. 典型题目复盘:一道很有意思的"环形字符串"问题
这道题是我第 5 轮印象最深的一道,题目本身不复杂,但解法可以写得非常优雅,也踩了很典型的坑。
题目大意(虚构描述):给定一个小写字母组成的字符串,可以进行循环移位操作,问最少经过多少次移动可以让字符串满足某个字符条件。这道题实际考察的是环形数据结构 + 前缀和/滑动窗口的结合应用。
我第一次拿到这道题的想法很直接:每次移动一位就判断一次条件,模拟全过程找出最小值。正确性没问题,但字符串长度稍微大一点,这个模拟法的复杂度就是 O(n²),在牛客上提交就直接超时了。
后来我在草稿纸上重画了一下这个环形数组,意识到一个关键的转换:把长度为 n 的环形数组拆成 2n 的线性数组。这样一来,"循环移位"就等价于在 2n 的线性数组上滑动一个长度为 n 的窗口。之前每隔 n 位就要重新计算的代价,变成了每次窗口滑动只需要删除头部一个元素、加入尾部一个元素,复杂度直接降到 O(n)。
这里还有一个我当时忽略的细节:窗口内的统计信息。因为题目要求的是判断某种"连续段是否满足条件",所以单纯用加法维护窗口总和不够,还需要维护段内状态的变化。我在代码里额外维护了一个计数数组,每次窗口滑动时更新受影响的字符计数,这样判断条件就能在 O(1) 时间内完成。
这道题的完整步骤可以这样拆解:
- 把原字符串拼接一次,得到 2 倍长度的字符串,用于模拟环形移位;
- 初始化长度为 n 的第一个窗口,统计好内部状态;
- 从第 n 个字符开始,每次窗口右移一位,更新状态;
- 每次移动后判断当前窗口是否满足条件,记录最小移动次数。
这次复盘给我的最大收获,是记住了**环形问题优先想到"拼接展开"**这个套路。以前遇到环形的题,我总想着怎么模拟旋转,其实转换到线性数组上,很多操作就变得非常常规。
4. 核心面试应用题:基于哈希表的动态缓存设计
这一轮我还刻意选了一道偏设计的题目,考察哈希表和缓存的结合。这类题在牛客上经常以"设计一个支持快速读取和更新的数据结构"的形式出现,非常接近日常开发场景。
题目要求(虚构简化):实现两个操作,一个是根据 key 取值,一个是写入 key-value 并淘汰最少使用的条目。读写的时间复杂度都要求 O(1)。
看到 O(1) 读写,第一反应一定是哈希表。但是单纯的哈希表解决不了"按使用频率淘汰"的问题,因为哈希表里的条目没有顺序的概念。这里需要引入一个双向链表来维护使用顺序。哈希表负责 O(1) 找到节点,双向链表负责 O(1) 调整顺序和删除尾部节点。
这个设计的核心在于:
- 每次访问一个 key,先在哈希表里找到对应节点,然后把节点从链表当前位置移到头部,这一步是 O(1);
- 写入新 key 时,如果容量满了,就删除链表尾部的节点,同时删除哈希表里对应的项,然后插入新节点到头部,这也是 O(1)。
实际操作中,我最开始犯了一个经典错误:忘记处理"更新已有 key"的情况。如果写入一个已经存在的 key,正确的做法应该是更新它的值,同时把它移到链表头部。我当时直接当成新 key 处理了,导致链表里出现了重复节点,后面访问时哈希表能找到,但链表顺序就乱了。这种细节如果没有自己动手实现一遍,光看题解是意识不到的。
这种"哈希表 + 双向链表"的组合设计,在面试里考察得非常多。它背后反映的是你对两种基础数据结构能力的理解和组合运用能力——哈希表解决随机访问,链表解决顺序调整。两者配合,才能同时满足两个看似矛盾的要求。我建议刷到一定阶段后,这类设计题一定要自己手写一遍完整的实现,而且要在纸上把"链表中节点移动"的指针操作画清楚,不能只在脑子里过。
5. 数据结构选型与算法复杂度分析
很多新手刷题有个误区:只要答案对了就行,不管用什么数据结构、什么复杂度。第 5 轮我特别想强调一个观点:算法题的核心不只是"解出来",更是"用合适的数据结构和复杂度解出来"。
在牛客上做题时,输入规模往往会有明确提示。比如有的题 n 最大到 10^5,那么 O(n²) 的算法基本没法过,必须想 O(n log n) 或 O(n) 的解法;如果 n 只有 100,那暴力解法可能完全可行。读懂题目隐含的规模信号,是选择算法方向的第一步。
这一轮我遇到一道前缀和相关的题,题目给的数据范围很大,常规做法是 O(n²) 预处理和查询,毫无疑问超时了。我的思考过程是这样的:首先确认前缀和数组可以在 O(n) 时间内构建;然后确认查询可以通过两个前缀和相减得到答案,单次查询 O(1);最重要的是,我意识到这题不需要二维数组,用一维前缀和加公式推导就够了。这个"降维"的过程,其实就是数据结构和算法优化的核心思路。
还有一个实际体会:很多人在分析复杂度时只盯着"循环套循环"的大结构,却忽略了隐藏在语言层面的复杂度。比如数组的拼接、字符串的重复复制,这些操作在高层语言里看着是一行代码,底层却是 O(n) 的遍历。我在刷字符串题时经常中招,一行"result += str"在循环里用了,结果整体复杂度就被悄悄抬高了一个量级。
**我现在的做法是,每写完一版解法,都先停下来做一个简单的复杂度估算,然后对照题目数据范围判断是否可行,再决定是直接提交还是继续优化。**这一步花的时间很少,但能省下大量超时重写的时间。
关于数据结构选型,我的经验总结是:
- 需要快速查找 → 哈希表,注意哈希冲突和扩容的代价;
- 需要维护单调性 → 优先考虑单调栈或优先队列;
- 需要频繁在头部尾部操作 → 双向链表或双端队列;
- 需要快速求区间和/区间统计 → 前缀和、树状数组或线段树;
- 需要维护集合关系 → 并查集。
不是说每种数据结构都要背得滚瓜烂熟,但在看到题目的瞬间,应该能形成一个"第一直觉"。这个第一直觉就是靠平时刷题时刻意练习"在看到题目后先想数据结构、再想算法步骤"这个顺序养成的。
6. 常见错误与调试经验汇总
第 5 轮我给自己定了一条新规矩:**每次提交失败,不急着改代码,先把错误原因写下来。**这个方法听起来很笨,但坚持下来效果非常好。下面是我这一轮记录的几类高频错误,可以说是非常典型的踩坑记录。
**数组越界,尤其是集中在边界索引处理上。**比如循环里用了i+1却没考虑最后一位,或者二分查找时mid-1写成了mid。这一类错误我几乎每轮都会犯,而且每次犯的位置还不一样。现在的解决办法是:凡是用到索引加减操作,默认先写一个边界检查的注释提醒自己,然后手动跑两个最小用例。
**栈溢出,通常和递归深度有关。**牛客上的数据规模有时候会刻意限制递归风格解法。比如二叉树相关的题目,用递归写中序遍历看起来很简洁,但树的深度一大,递归栈就爆了。这类问题有两种解法:改成显式栈的迭代写法,或者在递归函数里加入深度保护(但大部分题不允许这么干)。最根本的办法还是学会把递归改写为迭代。
**哈希表遍历中修改结构。**在遍历哈希表的同时进行插入或删除操作,很多语言会直接报错,或者产生未定义行为。我个人的建议是:如果你需要边遍历边修改,用一个临时列表先记录要操作的 key,遍历结束之后再统一改。虽然多了一点点内存,但能避免大量诡异的问题。
**整数溢出。**牛客的题很少直接给出很极端的边界,但遇到需要累加、乘法的场景,尤其涉及负数和最大值的比较,我都会习惯性判断一下是否需要使用更大范围的数据类型。这个习惯帮我避免过不少次莫名其妙的答案错误。
"答案对了但输出格式错了"。这类错误最烦人。在线判题系统对输出格式非常严格:多一个空格、少一个换行、字符串大小写不一致、顺序不对,都可能判定为错误。我在第 5 轮就吃过一次亏——题目要求输出每行一个结果,结果我全部拼在一行输出了。这类问题没有捷径,唯一的办法就是写代码前先仔细读一下输出格式的描述,写完代码后模拟一遍完整的输入输出流程。
我整理了一个第 5 轮的高频错误速查表:
| 错误类型 | 典型表现 | 排查方法 |
|---|---|---|
| 数组越界 | 运行时数组下标异常 | 检查循环边界,重点看i+1,i-1,len-1 |
| 递归超深 | 栈溢出错误 | 尝试迭代写法,或检查递归终止条件 |
| 遍历时修改容器 | 并发修改异常 | 先用列表记录再统一操作 |
| 整数溢出 | 大数值答案不对 | 改用更大范围的数据类型 |
| 输出格式错误 | 判题系统显示格式错误 | 核对输出要求,手动模拟输入输出 |
| 边界值疏漏 | 空数组、单元素数组结果错误 | 每个解法都用最小用例先跑一遍 |
调试的时候还有一个小技巧,就是构造一个最小的测试用例,然后一行一行手推。虽然看起来慢,但很多时候 bug 都是在这个过程中被发现的。尤其是指针类、索引类的错误,脑子里的推演和代码实际执行之间的差异,往往就在某一个边界条件上。
7. 从"刷题"到"解题"的思维转变
第 5 轮刷题过程中,我的感受有一个明显的分水岭,就是从"见过的题会做"变成"没见过的题也能推出来"。这个转变不是某一个瞬间发生的,但有一个非常具体的标志——我开始能在拿到题目后,先分析它属于哪一类问题,然后从问题本身出发推导解法,而不是先去搜刮记忆里有没有匹配的模板。
这个转变靠的不是刷更多题,而是刻意练习了下面这几个思维步骤:
第一步,抽象题意。把题目用自然语言描述的场景,翻译成数据结构与算法的语言。比如游戏里有 n 个玩家,按某种规则淘汰一人,这实际上是"约瑟夫环问题";再比如给出股票价格序列,求最佳买卖时机,这实际上是"最大差值问题"。一旦完成了这个抽象,后面就顺了。
第二步,先暴力后优化。不要指望一眼想出的最优解。我现在的习惯是:先提出一个最简单的、即使复杂度不高也能保证正确的方案,然后分析这个方案的时间花在了哪里,再思考能不能通过空间换时间、预处理、去重等方式优化。这个过程其实是面试中最看重的思考路径。
第三步,验证边界。纸上推演完核心思路后,先不要着急动手优化到极致,而是把空输入、单元素、全相同元素、逆序排列等极端情况过一遍。很多"思路看起来很完美"的解法,都是在边界上暴露问题的。这一步也可以叫"在动手编码前先在心里跑一遍测试用例"。
这个过程走完,往往代码还没写,思路就已经非常清楚了。写代码只是把已经想明白的东西翻译成语法而已,出错率自然大大降低。
这里还要单独说一下思维定式的问题。我刷题的时候经常发现,一旦脑子里出现了"这题要用 DP"的念头,就会一直往 DP 方向想,哪怕题目根本不适合。后来我养成一个习惯:在确定算法方向之前,先刻意问自己一句"如果不用这个套路,有没有更简单的思路?"有时候这一问,反而能找到捷径。
8. 刷题节奏管理与学习计划调整
第 5 轮给我的一个重要教训是:刷题也需要节奏管理,不能靠情绪驱动。情绪高涨的时候一天刷 10 道,低谷的时候一周碰都不碰,这种节奏对长期记忆非常不利。
我现在的安排是:每天固定 1.5 小时,不多不少。前 20 分钟用来回顾前一天的笔记,尤其是错题;中间 50 分钟做 1~2 道新题,重点不在数量而在理解;最后 20 分钟把当天的题做成记录,并且顺手把相关的旧记录看一遍。
这个 1.5 小时的安排,是从我自己的实际体验倒推出来的。以前我试过周末一次性刷一个下午,结果往往是前两个小时状态很好,之后开始疲劳,效率直线下降。每天固定短时间的优势在于,它让"刷题"变成了一个不需要意志力启动的日常习惯,到点就坐下,坐下就进入状态。
我还调整了题目难度分布。以前我老想着挑战难题,结果经常卡住不说,还很容易挫伤信心。现在我把比例调整为:60% 中等题 + 30% 简单题 + 10% 偏难题。简单题用来保持手感和建立信心,中等题是主要训练对象,偏难题只是偶尔换换脑子,不强求一定做出来。
另外,我开始比较严格地控制"看题解"的时机。一道题如果想了 30 分钟还没有思路,我会选择先放下,去做点别的,而不是立刻打开讨论区。这样做的好处是,给潜意识一点时间去消化题目。很多时候,过了几个小时甚至一晚上,再回头看这道题,思路突然就通了。如果实在是卡了很久,看题解也完全可以,但看完之后一定要合上题解,用自己的话完整写一遍代码,并且总结"我为什么没想到"这个问题的答案。
9. 第 5 轮完整刷题清单与知识点汇总
这一部分我把第 5 轮的核心题目类型和知识点做一个汇总,适合用来对照自己当前的学习进度。这份清单不能说覆盖一切,但它代表了我这个阶段认为比较重要的内容地图。
字符串与模拟(重点)
- 环形字符串/数组问题,关键套路是"拼接展开成线性数组";
- 回文判断与回文子串计数,核心是中心扩展法和动态规划两种路径;
- 字符串的窗口统计,滑动窗口思想,注意字符计数的更新细节。
动态规划(核心)
- 线性 DP 的"到当前位置为止"状态定义;
- 二维 DP 的表格填充顺序问题,特别是依赖左、上、左上三个方向的状态;
- 空间优化到滚动数组的方法,以及什么时候可以优化、什么时候不能。
数据结构设计题(进阶)
- "哈希表 + 双向链表"组合,实现 O(1) 读写的淘汰机制;
- 前缀和数组的构建与区间查询;
- 单调栈的典型应用场景,如找下一个更大元素。
图论与搜索(入门)
- 并查集的核心操作:查找根节点、路径压缩、按秩合并;
- DFS 与 BFS 的适用场景区别:BFS 适合求最短路,DFS 适合全排列和连通分量;
- 拓扑排序的实际应用场景。
查找与排序(基础)
- 二分查找模板及其边界变体,特别是"查找第一个等于某值的位置"这类变体;
- 快速排序和归并排序的实现细节,以及各排序算法的时间复杂度对比。
我把这些知识点全部记录在一个表格里,每个条目后面标注了"掌握程度"和"下次复习日期"。我建议你也根据自己的情况做一张这样的表,用记录的视角去管理自己的学习计划,比单纯列一个"我要刷 100 道题"的目标实用得多。
10. 一个非常容易被忽视的能力:阅读理解题意
刷了第 5 轮,我愈发觉得一个能力比"写代码"更影响做题速度和正确率,那就是阅读理解。牛客上很多题目描述又长又绕,还有不少隐含条件藏在例子和备注里。
我总结了一个"三步读题法",可以算是这一轮最大的方法收获:
- 第一遍,只读不写,读完以后用自己的话概括题目要求,确认"输入是什么、输出是什么、有哪些约束";
- 第二遍,圈出关键词,比如"连续""递增""最多""不能超过""时间复杂度不超过"等等,这些词往往直接决定做法;
- 第三遍,看输入输出示例,把示例代入自己的理解,确认题目问的和你理解的是同一件事。
千万不要跳过输入输出示例。示例不是给你验证用的,而是帮助你理解题意用的。我看到过太多人(包括我自己)读题读到一半以为自己懂了,直接开写,结果输出格式和题目要求差之千里,浪费时间不说,还搞崩心态。
还有一点,如果题目给了"数据范围",一定要认真看。数据范围不仅仅是复杂度选择的依据,还可能暗示了正确解法。比如 n 小到只有 20,那么状态压缩枚举是可以接受的;比如数值范围很大,就不能用数组下标法,得换用哈希表。
11. 第 5 轮刷题过程中的实战记录片段
写到这里,我贴一段第 5 轮自己做题时的真实笔记片段,你可以感受一下"记录"是怎么做的:
- 题目类型:环形数组 + 滑动窗口
- 初始思路:模拟每次旋转后重新统计窗口 → O(n²),不可行
- 关键转换:字符串拼接一次,把环形变线性,窗口滑动只更新头尾两个位置 → O(n)
- 边界条件:窗口初始位置覆盖 0~n-1 时,需要先统计好再进入循环
- 提交踩坑:第 5 个用例因为"窗口内计数数组未完全重置"出错
- 同类题:字符串排列判断、最小覆盖子串都是这个思路
- 复习日期:一周后
这样的记录写完大概需要 10 分钟,但它带来的价值远超 10 分钟。特别是"提交踩坑"这一栏,很多坑第二次遇到时,只要你翻了笔记,就能直接避开,不用重新交一遍学费。
我还特意把每道错题都标了"错误原因归类"。比如数组越界(30%)、思路方向错(25%)、边界条件遗漏(20%)、读题不仔细(15%)、细节实现错误(10%)。这组数据统计出来以后,我能非常清楚地知道自己主要的失分点在哪里,然后针对性地在下一轮去训练。没有统计就没有优化,这个原则不仅适用于刷题,其实适用于任何学习过程。
12. 关于牛客平台的一些使用心得
最后聊一聊牛客这个平台本身。第 5 轮用下来,我对它的理解也比一开始深了不少。
牛客有一个挺好的功能是错题集。每道做错的题可以直接加入错题集,系统会帮你按时间排列。我把它当成我刷题记录体系的"官方版本"再过一遍。错题集配合我自己整理的笔记,基本上能形成一个比较完整的复习闭环。
还有讨论区。我早期基本不看讨论区,觉得看了就等于抄答案。后来发现没必要这么极端。我现在的用法是:一遍 AC 的题,看看讨论区里别人有没有更巧妙的解法;做不出来的题,看题解之前先给自己一个时间限制(比如 30 分钟),到了时间就去看,但是看的时候重点看"思路起始点",不是"最终代码"。学会利用讨论区,把它当成学习资源而不是作弊工具,这个心态很重要。
牛客的在线自测功能适合在正式做某家公司真题前先用一下,熟悉题型分布和时间压力。我在第 5 轮做了两套模拟卷,虽然分数一般,但暴露出来的问题非常有价值:比如时间分配不合理、前面简单题花太久排查小细节、后面大题根本没时间想。这些都是在平时的单题练习中很难感受到的。
如果你是刚开始用牛客,我的建议是:先不要急着挑战高难度,先把"简单 -> 中等"的题量拉上去,同时养成记录习惯。这个平台最正确的打开方式,不是把它当成"挑战题库",而是当成"有反馈的练习场"——每一道题的通过与否,都是即时反馈;每一道错题和讨论区的思路碰撞,都是免费的优化素材。把这些素材整理进自己的笔记体系,才是刷题的核心价值所在。
13. 一些可以复用的刷题与笔记模板
为了让你可以直接上手,我把第 5 轮整理出来的几个模板也放出来,都是比较通用的格式,你可以根据自己的习惯调。
每日刷题模板
- 日期 / 当天总耗时
- 完成题数 / 通过题数 / 错误题数
- 新学到的知识点或套路
- 需要复习的旧题编号
- 一句话总结今天的收获或教训
单题记录模板
- 题目标题与难度
- 题目类型(字符串 / 二叉树 / DP / 贪心 / 数据结构)
- 我的第一思路及复杂度估算
- 最终解法及复杂度
- 踩坑点(越界 / 边界 / 超时 / 格式)
- 同类题引用
- 下次复习日期
周复盘模板
- 本周共刷几题,新旧题占比
- 错误类型统计
- 最值得记住的一类场景解法
- 下周最需要突破的专题
- 情绪与节奏自我评价(这个很重要,刷题要坚持,节奏比单次衝刺重要)
这些模板看着简单,但我实际用下来,最大的感受是把模糊的"刷题努力"变成了可量化、可回溯的过程。每周末翻一下这一周的记录,心里对自己的状态有一个非常清晰的把握:哪类题顺手了,哪类题其实一直没搞懂,下周应该练什么——这些问题都有了明确答案,而不是靠感觉。
14. 最后想说的实话
写这篇"牛客刷题记录5"的时候,我翻了一下前 4 篇的记录,最直观的感受就是:**这 5 轮刷下来,变化最大的不是会做的题变多了,而是看题的方式变深了。**以前拿到题,第一反应是"这题我见过没有",现在第一反应是"这题是什么类型、有哪些约束、可能有哪些方向"。
刷题这件事,很多时候给人的压力来自"还有好多题没刷""别人都刷了好几百道"。但你真正刷到第 5 轮、第 10 轮之后会发现,题是刷不完的,也不需要刷完。**需要积累的,是分析问题和解决问题的方法;需要训练的,是从一个领域迁移到另一个领域的底层能力。**这些能力靠的是"深度复盘+体系化记录",而不是"每天十道新题"的速度。
第 5 轮我自己最大的改进,是从"刷题机器"变成了"解题学徒"——不再为了数量而刷,而是为了理解而刷。如果你也刷到了这个阶段,不妨刻意放慢一点速度,多花时间在记录、回顾和总结上。这一轮写到这里,我接下来要做的就是按照记录里的复习计划,把第 5 轮的薄弱项再过一遍,希望下一个阶段能把这些点真正变成自己的本能。