做力扣模拟题,最容易被低估,也最容易翻车。我刷了三百多道题之后回头看,真正在面试现场把我救下来的,往往不是那些需要灵光一现的DP难题,而是老老实实按题目要求一步步模拟的“体力活”。今天这篇就把模拟题这件事聊透,从上手选哪些题、怎么一步步拆解,到调试代码的实战坑,一次性说清楚。
力扣(LeetCode)上的模拟题,说白了就是题目描述一个过程或规则,你不需要设计什么高深的算法,只要把整个过程按步骤走一遍,结果就出来了。它考的是你把自然语言转成代码逻辑的能力,以及代码实现的稳健性。很多人觉得模拟题“没技术含量”,实际上面试里这类题出现的频率远超想象,尤其在字节、腾讯这类注重代码基本功的面试中,模拟题经常作为第一道热身题或第二道中等题出现。
这篇文章适合几类人:刚开始刷力扣、不知道从哪里下手的新手;已经刷了一些题但总觉得模拟题写得乱、容易出bug的老手;以及马上要面试、想快速找回代码手感的人。我会按照“为什么刷模拟题—怎么拆解模拟题—用哪些题练手—真实调试经验”这条线来讲,全部内容来自我自己的实操过程和踩坑记录。
1. 模拟题到底是什么,为什么值得专门刷
1.1 模拟题的定义与分类
我先给模拟题画个像。力扣上题目大体分两类:一类是“你认不认识这个数据结构/算法”——比如你知道哈希表的O(1)查找、知道二分查找的前提是有序;另一类是“你知不知道题目在说什么”——电梯怎么走、机器人怎么扫、文字怎么翻转、数独怎么检查。后者就是模拟题。
按我自己的刷题经验,模拟题大致可以分成四个子类:
- 过程模拟:某个系统或角色按规则一步步执行,比如电梯调度、自动售货机找零。这类题状态多、分支多,最考验代码组织能力。
- 规则实现:题目给出一组明确规则,你直接用代码“翻译”规则。比如判断一个数是不是回文数、校验IP地址合法性。这类题逻辑本身不复杂,坑全在边界条件。
- 逐步推导:需要按步骤推进某种状态变化,比如矩阵旋转、螺旋遍历、生命游戏。这类题你把每一步的坐标变化搞明白就赢了。
- 输入输出解析:处理带格式的字符串、模拟某种命令行或文件系统操作。这类题在笔试中特别常见,正则、拆分、状态机混合在一起。
这四类都有一个共同点:算法模板帮不上忙,代码组织能力才是关键。你可以套模板解出二分、BFS、滑动窗口,但没有任何模板能帮你模拟“蛇怎么走”或者“表格怎么按列读”。
1.2 为什么刷模拟题是性价比最高的投入
我见过不少刷题的人,一上来就啃动态规划、图论,结果是“一看就会,一写就废”。原因很简单:难题考的是思维,但所有思维最终都要落到代码上,你的代码一长就乱、一乱就错,再好的思路也白搭。模拟题恰好是训练“把想法落成代码”的最佳工具。
另一个现实原因是面试频率。我在面试和被面试中观察到的规律是:面试官在第一轮特别喜欢出模拟题。为什么?因为一轮面试时间有限,模拟题不需要你“想出来”(题目已经把规则说清楚了),就看你能不能“写出来”以及写得多快多稳。它在短时间内就能考察代码风格、边界处理能力和调试速度,这些恰恰是日常工作最需要的能力。
也有人会说,力扣热题100里没几道模拟题,刷它干嘛?这个观点要辩证看。热题100确实是高频题集,但它是按“考点”而不是按“能力”分类的。你为了准备面试去刷热题100,刷到一半发现不会写,回头去补基础的时候,模拟题就是最好的补基础素材。我自己刷题初期就是靠每周固定做几道模拟题,把循环、条件判断、字符串处理这些基本功打扎实了,后面再刷热题100和OJ上的综合题明显顺手很多。
2. 模拟题怎么拆解,我总结的六步拆解法
很多人写模拟题翻车,不是不会写,而是拿到题就动手,边写边想,最后代码堆成一团乱麻。我后来养成了一个固定套路,按六个步骤来,基本能保证一次写对。
2.1 读题:把规则翻译成输入-输出模型
第一步也是最容易被忽视的一步:通读题目,把规则逐条列出来。我常用的方法是把规则换成“如果…就…”的形式,逐条写下来。比如一道机器人走迷宫的题,规则可能是:
- 如果前方是墙壁,就右转;
- 如果前方是空地,就前进;
- 如果走到终点,就停止。
写下来之后,你就有了一个等价于伪代码的逻辑清单,后面写代码只是把这套“如果…就…”翻译成if-else而已。
这个步骤还有一个关键产出:明确输入输出。输入是一个数组还是字符串?输出是一个整数还是一个列表?边界条件(空输入、单元素输入)如何定义?这些信息在动手前就要消化掉,否则写出来的代码必然要返工。
2.2 定状态:找出所有需要维护的变量
模拟题本质上是一个状态机,你必须在代码里维护好状态,才能让规则持续生效。我拿到一道模拟题,会先问自己三个问题:
- 当前“实体”的位置/状态需要记录吗?(坐标、方向、当前值等)
- 还需要记录哪些辅助信息?(已访问标记、剩余步数、历史记录)
- 这些变量在循环的哪一步更新?
举个例子,螺旋矩阵这道题就需要维护四个边界值(上下左右)、当前坐标、当前方向。搞定了状态变量,代码的“骨架”就清楚了。我见过很多人的代码变量满天飞但不知道每个变量是干嘛的,这就是没做状态分析的结果。
2.3 画流程:用纸笔走一遍样例
这一步最土但最有效。拿题目给的示例,自己在纸上一步一步走,记录每一步的状态变化。很多模拟题实际上是“样例会了,题目就懂了一半”的题型,尤其是矩阵类的题,坐标变化你必须亲手画一遍才有体感。
我之前刷一道“机器人在网格中清理地面”的题目,刚开始光在脑子里想,怎么都想不清楚机器人怎么掉头。后来拿草稿纸画了一个5x5的格子,把机器人每一步的坐标标出来,不到三分钟就把规律摸清楚了。说实话,大部分模拟题如果画图还理不清,那大概率不是你理解能力的问题,而是你对坐标系的敏感度还不够,这种敏感度只能靠多画多练补上来。
2.4 选模拟框架:循环结构怎么选
模拟题的代码框架,我总结就三种:
- 固定次数循环:明确要走n步或n个元素,用for循环最稳。比如“多项式展开n次”。
- 条件驱动循环:不知道要走多少次,只知道某个终止条件,用while循环。比如“直到到达终点”。
- 事件驱动循环:每一步根据当前状态选择下一步,本质上也是一种while循环,但内部会有复杂的分支。比如“电梯按楼层顺序响应请求”。
选错循环结构是模拟题常见的低级错误。比如题目明确说“最多执行n轮”,你非用while,结果忘记加退出条件,死循环直接超时。反过来,题目说“持续执行直到满足条件”,你非用for,结果次数估算错误,答案必然不对。
2.5 实现顺序:先主后次,先流程后细节
写代码时我习惯先写主干流程,再把每个分支的细节填充进去。什么意思?比如校验IP地址的题,主干是“按点拆分 -> 检查每段是否合法”,那我就先写出这个结构,再回头把“每段是否合法”具体实现(数字范围0-255、不能有前导零、不能为空等等)。
如果在写主干的时候就去纠结某个分支的实现细节,思路就断了,代码也容易写得乱七八糟。先把框架搭出来,再逐步填充,是模拟题避免代码混乱的关键。
2.6 验证边界:样例过了不代表你对了
最后一步是自我验证。我把常见边界情况分成几类,每类写一个测试用例,快速过一遍代码逻辑:
- 空输入、空字符串、长度为0的数组;
- 单元素输入、最小/最大值输入;
- 循环第一次迭代、最后一次迭代;
- 恰好卡在边界条件上的输入(比如IP段正好是255、坐标正好在网格边缘)。
这套验证做完,基本能把80%的隐藏bug拦下来。我见过太多人样例一过就提交,结果被边界用例杀得片甲不留。事实上,模拟题的隐藏测试用例大多都在边角料上做文章。
3. 模拟题适合谁刷,刷到什么程度算够
3.1 三类人最适合从模拟题入手
第一类是零基础或者刚入门的新手。力扣上的算法题对新手极不友好,动辄就是前缀和、双指针、单调栈,一个没听说过就得查半天资料。模拟题不需要前置知识,只需要你懂最基本的循环、条件、数组和字符串操作,非常适合作为刷题生涯的起点。
第二类是基础不牢、刷难题总卡壳的同学。你刷到二叉树或者动态规划觉得吃力,不必死磕,退回来刷一段时间模拟题,把循环条件、状态维护、函数拆分这些基本功练到形成肌肉记忆,再回去刷难题,你会发现理解速度明显变快。我自己就这样干过,效果很好。
第三类是面试前需要快速热身的人。模拟题是很好的“热身题”,因为它的思维量不大,核心是手感。每天早上花半小时刷一两道模拟题,相当于给编码手感和代码组织能力做一次晨练。
也有不太适合从模拟题入手的人:已经有一定算法基础、目标是冲击难题或者竞赛奖牌的朋友。模拟题对思维提升有限,刷太多边际效益会递减。我的建议是把它当作辅助训练,而不是主力方向。
3.2 刷到什么程度算过关
我自己给模拟题定的“及格线”是三个标准:
- 简单题轻松搞定:拿到一道简单的模拟题(比如力扣easy级别的过程模拟类),10-15分钟内能写出正确代码,边界情况考虑完整。
- 中等题不慌:中等难度的模拟题(比如矩阵类、字符串解析类),能在30分钟内理清思路并完成实现,出现的bug能靠断点调试自主定位。
- 长代码不散:代码量超过100行的模拟题,你还能清晰地组织函数结构,变量命名合理,逻辑层次分明,不靠“一坨”代码硬撑。
我个人觉得第三点是最值钱的,因为它直接对应日常开发的代码组织能力。能用小函数拆分逻辑的人,写出来的模拟题天然就比一个超长main函数清晰得多。
4. 力扣模拟题经典题单,从入门到进阶的练习路线
这里我按自己的刷题经验,整理了一条从易到难的练习路线。新手照这个顺序刷,基本不会产生“我不会”的挫败感,同时每道题都能让你学到点东西。
4.1 入门篇:先把“规则翻译成代码”搞熟练
入门阶段选题目,我只看两个标准:一是不需要任何数据结构和算法基础,二是能覆盖常见的基础操作(字符串、数组、循环、条件)。我推荐的题目如下:
| 题目 | 难度 | 核心考点 | 我的实战评价 |
|---|---|---|---|
| 13. 罗马数字转整数 | 简单 | 字符串遍历、前后字符对比 | 经典中的经典,训练“规则中的特例处理” |
| 9. 回文数 | 简单 | 整数反转、边界处理 | 三种解法都能写,训练多方案思考 |
| 66. 加一 | 简单 | 数组进位、循环反向遍历 | 必须考虑999→1000的进位扩散 |
| 258. 各位相加 | 简单 | 数字分解、循环终止条件 | 练两层循环,简单但有收获 |
| 263. 丑数 | 简单 | 除法循环、边界判断 | 注意n=0这种坑 |
| 171. Excel表列序号 | 简单 | 进制转换变体(26进制) | 和Excel列名互转是很好的配套练习 |
这批题刷完,你至少应该达到的状态是:看到一个自然语言的规则,能下意识地想“这不就是写个循环,然后里面套几个if吗”。
4.2 进阶篇:过程模拟和状态维护
入门题刷完,就可以挑战真正的“过程模拟”了。这类题的特征是:有一个实体(机器人、指针、光标、蛇)在一个环境(数组、矩阵、字符串)中按规则移动或者改变状态,你需要记录它的变化过程。
| 题目 | 难度 | 核心考点 | 我的实战评价 |
|---|---|---|---|
| 54. 螺旋矩阵 | 中等 | 边界收缩、方向切换 | 模拟题的“必修课”,边界维护练到极致 |
| 59. 螺旋矩阵II | 中等 | 进阶版螺旋填充 | 建议和54连刷,巩固边界处理 |
| 48. 旋转图像 | 中等 | 坐标映射、原地操作 | 和螺旋矩阵互补,考坐标变换敏感度 |
| 73. 矩阵置零 | 中等 | 空间复杂度优化 | 模拟中的“算法味”,优化思路值得学 |
| 289. 生命游戏 | 中等 | 状态同步、原地标记 | 状态更新的“同时性”是最大考点 |
| 874. 模拟行走机器人 | 中等 | 方向数组、指令状态机 | 方向控制的经典题,能训练二维方向感 |
这几道题刷完,我保证你对“方向数组”这个概念会形成肌肉记忆。以后遇到任何需要“上下左右移动”的题目,你会下意识地写出dirs = [(0,1),(1,0),(0,-1),(-1,0)]这个经典模板。
4.3 硬核篇:字符串解析与复杂规则
字符串解析类模拟题是笔试里的“常客”,尤其是银行、电商这类业务逻辑复杂的公司,特别喜欢出这种题。它考的是你把“业务规则”转换成代码的能力。
| 题目 | 难度 | 核心考点 | 我的实战评价 |
|---|---|---|---|
| 468. 验证IP地址 | 中等 | 格式校验、边界条件 | IPv4和IPv6两套规则,坑多题经典 |
| 8. 字符串转换整数(atoi) | 中等 | 状态机、越界处理 | 必须考虑各种非法输入和溢出场景 |
| 71. 简化路径 | 中等 | 栈辅助的规则解析 | “/../”和“/./”的处理逻辑很典型 |
| 224. 基本计算器 | 困难 | 栈+运算符优先级 | 虽然是困难题,但实现逻辑是模拟思路 |
| 38. 外观数列 | 中等 | 迭代生成、字符串构建 | 一层一层描述,代码极其工整 |
这里我想重点提一下第468题“验证IP地址”。这道题我前前后后写了三遍,每次都有新坑:IPv4的“01.2.3.4”是否合法?IPv6的连续冒号怎么处理?这些边界问题你做一遍根本记不全,至少要做两到三遍。我非常推荐把它当作模拟题里的“错题收藏夹”来反复刷。
4.4 扩展篇:力扣热题100中的模拟题
有人问,力扣热题100里有没有模拟题?严格来说,“热题100”是一个按面试频率排序的题集,里面的大多数题是算法题,但其中有几道很适合用“模拟思维”来做,至少能用模拟的思路写出一个朴素版本保底。比如:
- 1. 两数之和:你可以用暴力双重循环模拟“逐个尝试”,再用哈希表优化。
- 15. 三数之和:可以先排序,再用三重循环的模拟思路作为最基础版本,再优化成双指针。
- 3. 无重复字符的最长子串:可以用模拟思维做“从每个位置出发逐个扩展”,再升级为滑动窗口。
- 42. 接雨水:模拟思维可以按列逐列扫描,每一列看左边最高和右边最高,再优化成双指针。
我自己的建议是,刷热题100遇到想不出最优解时,先从模拟思路写一个“笨版本”保底,在面试中这至少能让你输出可运行的代码。毕竟面试官最怕的不是你解法不够优,而是你一道题卡死在那里一句话都写不出来。
5. 实操实录:三道代表题的完整拆解
讲再多方法论,不如带大家实际走三题。我选了三道风格差异很大的题目,一道是矩阵类、一道是字符串类、一道是过程模拟类。我会还原我的完整思考过程,包括怎么从读题到写代码。
5.1 螺旋矩阵II:边界收缩的实战演示
题目给一个正整数n,要求生成一个n x n的矩阵,按顺时针螺旋顺序填入1到n²。这道题是模拟题的“试金石”,因为它同时考查方向控制和边界维护。
我当时的核心思路很简单:维护四个边界——上、下、左、右,每次沿着某个方向走到边界,然后收缩这条边界,再换方向。代码结构如下:
- 用left、right、top、bottom记录当前有效边界;
- 按“右 -> 下 -> 左 -> 上”顺序循环填充;
- 每走完一个方向,就把对应的边界向内收缩一格;
- 当填入的数字超过n²时,结束。
写这个代码的时候,最容易犯的错有两个。第一个是在收缩边界后没有检查是否越界,导致下一次循环继续用已经收窄的边界。第二个是n为奇数时,最中心的那个格子可能被漏填或者重复填。解决办法很暴力也很简单:用num计数,每当num > n * n立即break,再检查一遍结果是否覆盖了全部元素。
这道题我刷第一遍的时候用了大概40分钟,中间调试了三次。主要问题就是边界收缩的时机没把握对,最后在纸上把每一步画出来才搞清楚。第二次刷就快多了,15分钟写完整,一次通过。
5.2 外观数列:迭代生成类题目的通用解法
“外观数列”题目要求:从“1”开始,每一轮是对上一轮的“报数”——1读作“一个1”,所以下一轮是“11”;11读作“两个1”,下一轮是“21”。依此类推,求第n轮的结果。
这道题的思路就是“循环模拟”,没有任何数据结构难点。我的实现思路分三步:
- 维护当前字符串cur,初始为“1”;
- 每轮遍历cur,统计连续相同字符的个数count;
- 把count和字符本身拼接到下一轮的字符串中,更新cur。
代码本身很短,但有一个我很容易犯的低级错误:最后一段连续字符的统计结果忘记拼进去。比如遍历到字符串末尾时,还没来得及把最后一组“count + char”加到结果中。我的解决方案是循环结束后再补一次拼接逻辑,这个坑踩过之后,我再也没错过。
这道题还有一个小变体思路:如果题目改为求第n轮的长度(而不是内容),你可以用动态规划的思想记录每轮长度,而不保存整个字符串。当然这是后话,先把基础版本的实现写对再说。
5.3 简化路径:字符串解析类题目的栈思路
测试题“简化路径”给一个Unix风格的绝对路径,要求规范化:连续斜杠合并为一个,"."表示当前目录要跳过,".."表示返回上一级目录。实现方式非常直白:用栈。
我的处理流程是:
- 按“/”分割字符串;
- 遍历每一段:
- 如果段为空或为“.”,直接忽略;
- 如果段为“..”,弹出栈顶(如果栈非空);
- 否则将段入栈;
- 最后用“/”拼接栈中元素,并在开头加一个“/”。
这道题最大的坑藏在两个地方。第一个是“/a/b/../../c”这种跨多级回退的情况,如果栈空了还继续遇到“..”,你必须要对空栈做保护,否则会越界报错。第二个是输入本身就是“/”时,输出应该还是“/”,而不是空字符串。这些都是边界测试用例埋伏的重点,也是评测系统最经常偷袭你的地方。
我在第一次提交这道题时,忘记考虑空栈时弹栈的情况,直接被一个“/../../”的测试用例打回原形。这个教训我现在还记得很清楚,所以后来凡是涉及栈的模拟题,我都会特别留意“栈空时候的pop”如何处理。
6. 模拟题调试技巧与常见错误实录
6.1 打日志是个好习惯,别总想着“瞪眼法”
写模拟题时,代码一长,逻辑就容易绕。我最推荐的调试手段就是“打中间状态”。比如模拟机器人移动的题目,在每次移动后打印当前坐标和方向;模拟矩阵填充的题目,每填一圈打印一次矩阵内容。肉眼看到状态的演变过程,比盯着代码干想快十倍。
这个方法对面试场景同样管用。面试现场如果你卡住了,可以理直气壮地问面试官:“我能打印一下中间结果看看吗?”,这比你干坐着沉默一分钟要强一个量级。我在实际面试中用过这个策略,面试官非但没有扣分,还觉得你调试意识很好。
6.2 模拟题最容易踩的七个坑,我列一份速查表
| 坑类型 | 具体表现 | 对策 |
|---|---|---|
| 边界漏判 | 数组越界、坐标出界 | 循环前后检查边界条件 |
| 状态更新顺序错误 | 先用了新状态再更新旧状态 | 明确旧状态和新状态的使用顺序 |
| 死循环 | while循环缺退出条件 | 在循环末尾检查是否满足终止条件 |
| 漏掉末段处理 | 字符串遍历完但最后一组未处理 | 循环结束后补一次拼接/处理 |
| 空栈/空列表操作 | 对空容器执行pop | 操作前判断非空 |
| 进位/溢出 | 整数相加溢出、数组进位扩散 | 使用长整型或手动处理进位 |
| 同一变量重复使用 | 逻辑混淆,结果串位 | 每个变量只承担一个职责 |
这七条是我刷模拟题到现在最常遇到的坑,几乎每道题都能至少踩中一条。我建议你把这张表打印出来贴在电脑旁边,每次提交前对照检查一遍,能省掉不少被红色Wrong Answer爆头的痛苦。
6.3 一次提交通过的“三查三改”法
经过很长一段时间的实践,我摸索出了一套提交前检查方法,叫“三查三改”:
- 一查循环边界:检查所有for循环和while循环的起止条件是否正确,是否会出现多一次或少一次迭代。
- 二查变量更新:检查循环体内的状态更新顺序,是否出现“用了新值还以为是旧值”的情况。
- 三查边界用例:用输入的下界、上界、特殊值,快速在脑中或草稿纸上跑一遍,验证代码的鲁棒性。
整体流程不超过五分钟,但能把一道模拟题从“样例过”提升到“提交一次过”的概率至少翻一倍。
6.4 百行以上代码的组织技巧:函数拆分的艺术
当你开始刷第874题“模拟行走机器人”这类代码量大的题目时,你会真切地感受到:不会拆分函数的代码,写到后面自己都看不懂。
我推荐“一函数一职责”原则。方向转换写一个函数,判断下一步坐标是否合法写一个函数,主循环只负责调用这些函数。这样做有三个好处:逻辑清晰、调bug范围缩小、代码可复用。特别是方向转换函数,在每个机器人、贪吃蛇、扫地机器人题目里都能复用,写完直接复制粘贴修改参数就行。
这个习惯在面试中还有个加分项:面试官看完你的代码,会觉得你写代码是有“工程素养”的,而不是单纯的竞赛选手型写法。这在实际工作中尤其重要,毕竟面试官要招的是能写生产代码的人,不只是一个能AC题目的选手。
7. 模拟题在面试实战中的应用场景与策略
7.1 面试中模拟题的正确应对节奏
参加技术面试时,如果碰到模拟题,我的节奏是这样的:
- 前5分钟:和面试官确认题目所有规则。这个环节非常重要,千万不要跳过。你多问一句“如果遇到..怎么办?”不会被认为理解能力差,反而显得你考虑周全。
- 接下来5分钟:提出你的模拟思路,并用示例走一遍。在纸上或白板上把样例逐步推导,让面试官看到你的思考过程。
- 接下来10-15分钟:写代码。保持代码结构清晰,使用有意义的变量名和适度的函数拆分。
- 最后几分钟:主动和面试官讲你考虑的边界条件,甚至主动提出“要不要我用刚才说的边界用例试一下自己的代码”。这个主动行为在面试官眼里是加分显著的。
模拟题本身不难,所以面试官期待的是“完整的代码 + 清晰的逻辑 + 稳健的边界”,而不是“灵机一动”。
7.2 如面碰到力扣原题,别让兴奋冲昏头脑
很多面经里提到“模拟题大概率是力扣原题或小变体”,这确实是事实。有不少人看了面经之后专门背题,碰到原题就狂喜,直接默写。我的建议是:看到原题可以心里开心一下,但依然按正常的流程和面试官沟通,按部就班地写代码、讲思路。原因很简单:
第一,面试官能看出来你是否真的理解题。如果只是随手默写,被追问“为什么这里要这样处理”,很容易露馅。第二,原题会有小改动,比如“把正整数改为非负整数”“把数组改为链表”,如果你默写原题的边界处理,恰好就会掉进改编的坑里。第三,面试本来就是沟通的过程,多讲思路会体现你的协作能力,这在面试官的反馈里占比很高。
7.3 模拟题思路对日常开发工作有什么用
最后说一个更长远的角度。模拟题虽然不考高深算法,但从日常开发的角度看,它几乎是“最写实的算法题”。
业务开发中大量代码都是“照着规则把事情做完”——订单状态流转、文件解析、报表生成、协议实现。这些事情用到的能力,和模拟题考的能力几乎一一对应:正确理解需求文档(读题)、拆解流程顺序(定状态、画流程)、组织代码结构(函数拆分)、处理各种异常边界(边界验证)。从这个角度看,刷模拟题不只是为了面试,更是在练一种“把规则变代码”的硬实力。
那些分布式系统、消息队列、微服务架构,归根结底落到单个函数里,大部分逻辑就是模拟题这样“一步步走完”的过程。所以别再说模拟题没用了,它其实是面试和实际工作之间重合度最高的题型。
8. 一些刷模拟题的扩展思路
刷题这件事,方法和心态同样重要。模拟题相对容易,但容易的题也有容易的刷法。
我比较推荐的做法是一个系列一个系列地刷,比如先集中刷字符串解析类、再集中刷矩阵类。同类题反复练,你对这一类问题的敏感度会有质的提升。刷的时候给自己记个时,简单题控制在10分钟左石,中等题控制在30分钟以内,超时就先看题解,再自己手写一遍。
每道题刷完,值得花两分钟记录一下这道题的知识点和踩过的坑。这些记录就是你自己的“错题本”,三个月后回头看,会比刷题数量更有价值。
等到某个类型的模拟题你已经能稳定写出满分代码的时候,再去做一个“反向练习”:看完题,不急着写代码,先在注释里写清思路和步骤分解,再照着自己的注释写代码。这个训练能逼你把思路结构化,对面试时的白板编程很有帮助,也是我把模拟题能力内化最快的一个方法。
至于OJ刷题平台上的综合套题,等你把力扣的模拟题基础打牢之后,再去刷那些混合类型的套题,你会发现答题速度有明显提升。终究原因很简单:模拟题训练的就是你从拿到题目到写出可运行代码之间的“翻译速度”,这个速度在任何类型的题目中都是通用的。