1. 先认清目标:不同阶段的刷题策略完全不同
先说个我在社区里看了无数次的场景:新人兴冲冲注册了力扣账号,打开题库,从第1题“两数之和”开始,一路往后刷。刷了三十多道,发现前面做过的题全忘了,遇到新题还是没思路,于是开始怀疑自己是不是不适合编程。
这几乎是每个刷题的人都会经历的过程,包括我自己。我最早开始刷力扣的时候也是这个状态,一天刷三道,记笔记、看题解、抄代码,坚持了一个月,回头做第一周刷过的题,竟然连题目都想不起来。后来我才意识到,问题不是我不努力,而是刷题这件事本身有它自己的方法论,盲目堆数量是最低效的策略。
不同阶段的刷题策略是完全不一样的。如果你是在校学生,目标是大厂实习或秋招,你的刷题节奏应该是“广度优先再补深度”,先把高频考点铺开,保证每个主流题型都见过、能写;如果你是已经工作、想跳槽的社招选手,你没有大块时间,需要的是“高频题优先、按公司风格定制”,比如你面的是做搜索业务的公司,字符串处理和动态规划就得重点加强;如果你只是想提升编程思维、锻炼逻辑能力,那根本不需要跟风刷热题100,按自己的兴趣和薄弱环节来就行。
热搜词里那句“进大厂为什么要刷力扣”,很多人的理解是“大厂面试官喜欢考算法”。这个说法对,但没说到根上。面试官考算法不是为了让你证明“你刷过题”,而是要通过算法题考察三件事:第一,你拆解复杂问题的能力,能不能把一个没见过的需求拆成可处理的子问题;第二,你的编码基本功和严谨程度,边界条件、空指针、数据溢出这些细节是不是能一次写对;第三,你的沟通思路的方式,你在动手写代码之前能不能把自己的思路讲清楚。所以力扣题本质上是一个低成本、标准化的能力考察工具。理解到这一层,你就知道刷题不应该追求“我做了多少道”,而应该追求“我能不能把一个陌生问题一步步拆清楚,并写出无bug的代码”。
这一篇我打算把我这两年刷力扣的实际经验、踩过的坑、验证过有效的刷题顺序和复盘方法完整写出来。不会照搬网上那种“三个月从零到offer”的鸡汤路线,而是尽量说点实操层面的东西,包括每天都干什么、遇到不会的题怎么办、错题本怎么记、模拟面试怎么练。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 按知识板块拆题单:比按题号刷高效得多的组织方式
刚入坑的时候,我最喜欢干的事就是打开题库页,按“通过率从高到低”排序,从简单的开始刷。通过率高的题确实简单,但简单题和简单题之间没有任何系统关联。今天刷一道数组题,明天刷一道贪心题,后天刷一道回溯题,大脑里的知识结构永远是散的。
后来我换了个策略:按算法标签和数据结构分类,一个板块一个板块地打。这个转变的效果可以说是立竿见影,同一类题集中刷七八道之后,这类题型的套路就开始在脑子里显形了。比如递归题刷多了,你会发现绝大多数递归都能先写终止条件再写递归体,思考难度立刻降一半;二叉树题刷多了,你会本能地先想“这题要不要遍历顺序”“要不要返回两个值”“要不要带父节点信息”——因为同类题见得多,各种可能性已经内化成了条件反射。
具体怎么拆板块,我按自己验证过的顺序列一下,这个顺序本身也是有讲究的:
第一梯队:线性表与哈希(约2周)
- 数组、链表、栈、队列、哈希表
- 这个梯队是所有后续题型的基础。你不会哈希表,后面很多“空间换时间”的优化思路都没法落地;你不熟链表,二叉树你也没法画清楚引用关系。
第二梯队:字符串与双指针(约1~2周)
- 双指针、滑动窗口、字符串匹配基础
- 这个板块练的是边界控制和指针移动逻辑。滑动窗口题看起来花样多,其实核心就一个:什么时候扩大窗口、什么时候缩小窗口、窗口内维护什么状态。
第三梯队:二叉树与递归(约2~3周)
- 二叉树遍历、BST、树的递归、最近公共祖先等
- 为什么把二叉树放在第三个而不是第一个?因为二叉树是理解递归最好的载体。树的递归结构非常清晰,从根到叶子天然就是一个递归路径。把二叉树的几十道题吃透,你对递归的理解会直接上一个台阶,之后再学回溯、动态规划都顺很多。
第四梯队:排序与二分(约1周)
- 快排、归并、堆排序、各种二分变体
- 排序算法不只是要会写,更要理解它们的时间和空间复杂度,实际做题时很多题不是让你“实现排序”,而是考察排序背后的分治思想。
第五梯队:回溯(约1~2周)
- 全排列、组合、子集、棋盘类问题
- 回溯的核心是“选择—递归—撤销”,这六个字看着简单,但真正跑起来哪里该剪枝、哪里该恢复状态,全是细节。
第六梯队:动态规划(约2~3周)
- 一维DP、二维DP、背包问题、区间DP、状态压缩DP
- DP是所有板块里最需要“量变到质变”的。我建议从“爬楼梯”“打家劫舍”这种最基础的开始,先练出“定义dp数组 — 写转移方程 — 初始化 — 确定遍历顺序”的四步法,再逐步上难度。
第七梯队:图论与贪心(约2周)
- DFS/BFS、拓扑排序、并查集、最小生成树、最短路径
- 图论题在面试中出现频率不如DP,但大厂笔试里经常会有。很多人会跳过这个板块,我建议至少把DFS、BFS和并查集吃透,拓扑排序也很值得掌握,因为很多“依赖关系”场景都能用上。
这个顺序不是我拍脑袋定的,它的逻辑是**“工具先行,思想随后”**:先学会数组、哈希、链表这些基础工具,再用双指针和递归这两大核心思想武装自己,最后才进入回溯、DP这些高度依赖前两者的算法范式。你把第三梯队“二叉树”打扎实之后回头再刷第一梯队的题,速度会快很多,因为此时你已经有能力从“递归遍历”的角度重新审视数组和链表了。
3. 一道具体题拆解:从读题到最优解的完整思考链
热词里出现了“力扣最长公共前缀”,这让我想到一个特别好的例子。这道题是力扣第14题,难度简单,但我在新人身上见过太多人直接上来就写二重循环,忽略了这道题真正想考察的“纵向扫描”和“分治思想”。这里我不只是讲这道题怎么做,我想借它演示一下,一道题从看到题面到写出最优解的完整思考链路应该是什么样的。
力扣第14题,输入一个字符串数组,输出所有字符串的最长公共前缀;如果不存在公共前缀,返回空字符串。比如输入["flower","flow","flight"],输出"fl"。
第一步:先想暴力解法。 最常见的直觉是横向比较:拿第一个字符串当基准,用它的每一个字符挨个去和后面所有字符串的对应位置比。实现起来就是两个循环,外层循环跑第一个字符串的字符,内层循环跑数组里剩下的每一个字符串。这个解法的时间复杂度是O(n * m),n是字符串个数,m是最短字符串长度,空间复杂度O(1)。这个解法没什么错,但很多人会忽略一个边界:如果数组是空的怎么办,这时应该返回空字符串而不是直接访问第一个元素。
第二步:想优化思路。 这道题的优化空间其实很大。你可以先找出最短的字符串,因为公共前缀的长度不可能超过最短字符串的长度;你可以用二分法去猜公共前缀的长度,每次去验证前半段是不是所有字符串的公共前缀;你还可以用“纵向扫描”,不是横向拿一个基准去整体比较,而是同时看所有字符串的同一列字符,一旦发现这一列字符不统一,立刻返回前面已经验证过的部分。
我第一次刷这题用的就是横向比较,写完之后看了一眼题解,发现纵向扫描解法比我想象的更简洁。纵向扫描的思路是把指针i指向字符串的每个位置,同时比较所有字符串在第i个位置的字符,如果长度不够或者字符不同就直接终止。这个解法的代码逻辑非常干净:
javascript复制var longestCommonPrefix = function(strs) {
if (strs.length === 0) return "";
for (let i = 0; i < strs[0].length; i++) {
const char = strs[0][i];
for (let j = 1; j < strs.length; j++) {
if (i === strs[j].length || strs[j][i] !== char) {
return strs[0].slice(0, i);
}
}
}
return strs[0];
};
这里的核心技巧是把“公共前缀”理解成所有字符串在每一位上都相等的连续字符段,而不是把第一个字符串当成基准然后“去匹配别人”。这个视角的转换看着不大,实际上思考路径完全不同。前者是“我选一个基准,大家向它看齐”,后者是“所有人站在同一条起跑线,逐列检查谁先掉队”。类似的视角转换在力扣里很常见,很多题你从“选基准”切换到“逐列比较”,思路立刻就开阔了。
第三步:思考变体。 学到这如果你只满足于AC,那收货就太少了。我自己刷题的惯例是,拿到一道题AC之后,立刻去题解区翻找两个东西:一是有没有比我的解法复杂度更优的方案,二是有没有这道题的变体或延伸。比如这道最长公共前缀,它的变体可以是“字符串数组公共后缀”“多个字符串的最长公共子串”“给两个字符串数组,找它们的交集字符串”。这些变体不会直接出现在题目里,但如果面试官想多考你十分钟,完全可能现场改一版出来。你平时刷题时候多往这个方向想,面试时的临场应变能力就会强很多。
这就是我说的“一道题吃透胜过十道题掠过”。刷题数量确实重要,但很多人的问题不是数量不够,而是每一道题都是孤立的,没有串成网络。当你开始主动思考一道题的变体、扩展、复杂度边界,一道题就不只是力扣题库里编号14的那行文本,而是变成你解题工具箱里的一整套策略。
4. 刷题的常见坑与我的避坑方法
很多刷题攻略只会告诉你“要刷多少题、按什么顺序刷”,但很少有人认真讲那些坑。我在刷题过程中踩过不少坑,有些坑甚至反复踩。这里我把它们整理出来,每个坑附上我当时是怎么掉进去的,以及后来怎么爬出来的。
坑一:只看题解,不自己动手。
这是最隐蔽也最危险的坑。它的典型症状是:一道题看了题解觉得“懂了”,然后直接跳过编码环节,进入下一题。等过了两个星期再回头写这道题,很容易卡壳。为什么?因为看题解时你的大脑处于被动接收模式,你理解的是“别人的思路”,而不是“你自己从0推导出来的思路”。这两种理解在大脑中的存储方式完全不同,前者是短期记忆,后者才会留下长期可调用的模式。
我的解决方法是严格执行“没写不AC,AC不复看”原则:拿到一道新题,先花二十分钟自己思考,有思路就写;没有思路就看题解,但看完题解必须把代码合上,凭自己的理解重新写一遍。这个“重新写一遍”是关键,它逼着你把别人思路转译成自己的语言。我自己在带新人时也一直坚持这个要求,凡是不亲手重写的,过两天必然忘。
坑二:死磕一道题超过一小时。
刷题需要坚持,但不需要“死磕”。一道题如果你已经想了四五十分钟还是没有清晰思路,大概率是知识点盲区,而不是思路不够努力。这时候继续硬磕,边际收益很低。
我的习惯是:超过35分钟没有进展,就停下来,去题解区学习。注意是“学习”不是“抄答案”,我会仔细看解题者的思考过程,看他怎么从题目条件推到算法选型。看完之后合上题解自己重新写一遍代码,第二天再手写一遍巩固。这样一道难题花的总时间可能在两小时左右,但收获比死磕一下午大得多。
坑三:只刷简单题或只刷难题。
只刷简单题容易产生虚假的成就感——每天AC好几道,系统记录里一片绿色,但面试遇到中等难度立刻懵。只刷难题则是另一种极端,每天被打击到怀疑人生,而且难题往往包含多个知识点叠加,基础不牢时刷了也白刷。
我建议按比例来配比:简单题占三成,中等题占五成,困难题占两成,并且在刷题顺序上保持“大部分时间在一个主题内,少量时间做跨主题的随机题”。我自己的刷题节律是:平时按板块推进,周末随机抽五道高频题做模拟练习。这样既保证知识体系完整,又不至于让手感变得单一。
坑四:忽略空间复杂度。
能AC的解法不一定能过面试。面试官问完时间复杂度,一定会接着问“还能不能优化空间”,这是力扣系统不会考你的关键面试环节。所以刷题时我养成了一个习惯:每写完一个AC代码,我会问自己三个问题:这个解法的最坏时间复杂度是多少?额外空间用了什么?能不能用O(1)空间换O(n)时间,或者反过来?这三个问题想一遍,一道题的价值就翻倍了。
坑五:刷完不复盘。
这可能是最普通的坑,但也是长期影响最大的坑。热词里“力扣刷题攻略”相关的文章很多都把复盘列为核心方法,但真正坚持的人很少。我自己的复盘方法是:每周日花一个小时,把这周AC过的题快速浏览一遍,挑出三到五道最有收获的题,写进自己的错题本——不是抄代码,而是写“这道题考了什么知识点、我一开始怎么想的、哪一步是关键转换、如果一星期后再做一遍我会从哪里想起”。这个错题本每周只花一小时,但它让我的刷题效率提高了至少一半,因为每道题的学习成果都被有效沉淀了。
5. 刷题路线图:从入门到模拟面试的完整节奏
现在把前面说的策略、板块、坑都串起来,给你一套可以直接抄的刷题节奏。这套节奏是我自己的实际经验,不一定适合所有人,但至少提供一个经过验证的参考框架。
第1~2周:热身与基础
目标是熟悉平台操作和找回编码手感。做数组、字符串、哈希相关的基础题40道左右,全部选简单难度,每天3~4道。第一天先做“两数之和”“有效的括号”这种经典入门题,把读题、写代码、跑测试用例的流程走顺。这周不追求速度,追求的是“每道题都完整走一遍:读题—思考—写代码—测试—提交”。
第3~6周:核心算法专题攻坚
进入二叉树、递归、回溯、二分、滑动窗口这几个板块,每天2~3道中等难度为主。这个阶段是真正的能力爬升期,你会感到明显的难度跳跃,这很正常。遇到反复写不出来的知识点,回到上一章对应板块补练基础题。每天的刷题量可以少,但每道题都要按前面说的“写一稿—看题解—合上重写”标准来。
第7~8周:动态规划专项
DP必须用整整两周来打,因为它的知识密度很大。第一天从“爬楼梯”“使用最小花费爬楼梯”开始,感受一下dp数组的定义方式;然后过渡到“打家劫舍”“最长递增子序列”;最后挑战“背包问题”和“编辑距离”。这个阶段会特别痛苦,因为DP题的代码通常只有十几行,但思考过程可能比回溯题复杂十倍。
第9~10周:查漏补缺与综合训练
开始混合刷题,每天从题库里随机抽5道题,不再按标签分类,模拟真实面试中“不知道题目类型”的状态。这个阶段你会发现有些知识点已经生疏了,不用慌,这正是查漏补缺的好机会。同时开始关注“热题100”里的高频题,这些题是无数面试经验总结出来的重中之重,值得反复做两遍以上。
第11~12周:模拟面试与输出
进入冲刺阶段。每天限时45分钟做一道中等题或困难题,模拟真实面试的节奏:先和“面试官”口述思路,再动手写代码,最后自己复盘哪些地方卡了、哪些边界条件差点漏掉。口述这一步容易被人忽略,但在真实面试中它的重要性不亚于写代码本身,因为面试官需要通过你的口述来判断你的思考过程。
这个节奏每天需要投入的时间在1.5到2小时左右,如果你是在职跳槽,可以适当拉长周期——第3~6周扩展到6周,第7~8周扩展到4周,总周期拉到四到五个月也完全可行。关键是节奏要稳定,宁可每天刷一道,也不要一天刷八道然后停三天。手感和思维模式都是靠持续频率养出来的。
6. 错题本的正确打开方式:不是抄代码,是沉淀思路
很多人在刷题攻略里看到“必须建错题本”,于是准备一个笔记本,把AC不了的题的代码抄一遍,然后就没有然后了。这种错题本除了带来一种“我很努力”的心理安慰,几乎没有任何实际作用。
我自己用了很长一段时间,反复迭代后总结出一套错题本的记录格式,现在分享出来:
核心字段一:这道题考了什么知识点
不要写“数组”“字符串”这种大类,要具体到“哈希表 + 前缀和”“双指针 + 排序后遍历”“递归 + 状态回溯 + 剪枝”。这样做的好处是,三个月后翻笔记,你一眼就能看出自己的薄弱板块分布。
核心字段二:我最初的思路是什么,卡在了哪里
比如“我想到了用双指针,但没想清楚左指针移动条件”“想到了用dp,但没想清楚状态定义”。这个字段是错题本最重要的部分,因为它记录的是你的思维盲区。刷题的本质是训练思维模式,而思维模式优化的前提是你清楚地知道自己哪里想错了。
核心字段三:最优解的关键一步是什么
比如“关键在于先排序再双指针,把无序问题转成有序问题”“关键在于用preSum数组把区间和问题转换成前缀和之差”。只记录“关键一步”而不是完整解法,是为了强迫自己以后看笔记时要重新推导整个解法,而不是顺着笔记上的代码看一遍就自欺欺人。
核心字段四:我能想到的一个变体
这是我自己加上的字段,效果出奇地好。每道题记录一个你能想到的变体,比如原题是“求数组中和为target的两个数”,变体就是“求数组中和为target的三个数”“如果数组有重复元素怎么办”。这个字段逼着你跳出题目本身去思考考点,是我错题本里含金量最高的一个部分。
错题本还有一个使用姿势很关键:定期复习。我每周日会花半小时只看错题本,不打开力扣,从“考了什么知识点”和“最优解的关键一步”反推整道题的解法。推不出来的题就标记个重点符号,下周重新刷一遍。这个方法也叫“间隔重复”,比每次刷题前翻一遍笔记有效得多。
7. 热题100到底怎么用:既别神化也别浪费
“力扣热题100”这个题库在社区里几乎是“必刷”的象征,很多人的刷题计划就是照着这100道题一个个过。我的看法是:热题100确实是好东西,但很多人用它的方式可能不太对。
热题100的意义在于它覆盖了最常见的考点和最常见的难度分布,适合用来做“面试前的高频考点查缺补漏”,但它不适合作为第一轮刷题的主线,更不适合从头到尾只刷它。原因很简单:热题100里的题是打散的、没有按知识点分类编排,如果你基础薄弱,直接刷它很容易陷入“这题不会也没关系,看了题解继续下一题”的循环,系统性依然不够。
我建议这样使用热题100:
第一步,先把前面的板块专题刷完一轮,这时候你在每个知识点下已经有了一些底子。
第二步,在你处于“查漏补缺与综合训练”阶段时,开始刷热题100。每天5道,不按顺序,随机抽取。如果你能做到“看到题目,先说出它属于哪个板块,再给出大致思路,最后写出AC代码”,这道题就过了。说不出来或写不出来,回到对应板块专项补练。
第三步,面试前两周,把热题100里你做错过的题再刷一遍。注意是“做错过的题”,不是全部100道。复习错题比重复做会的题有效十倍。
除了热题100,各大平台的“企业题库”也值得利用。力扣上很多大厂都有自己的真题板块,那些题和面试的匹配度更高。我的建议是:按目标公司筛选真题,不要贪多,每个公司刷最近半年的20~30道即可。真正临近面试的那两周,与其刷新题,不如把目标公司的真题吃透,尤其是你反复错过的老题。
这里我还想强调一个反直觉的点:面试现场遇到原题的概率并不高,但遇到“同类题”的概率极高。热题100和公司真题的价值在于让你熟悉“这个考点的常见出法”,而不是赌面试会出原题。当你把一种题型的常见变体都见过之后,面试现场就算题目改了包装,你也能迅速识别出它真正的考点。这就是刷题从量变到质变最明显的一个信号。
8. 最后再分享一点我对刷题心态的真实感受
写了这么多方法论,最后想谈点软性的东西,因为在带新人刷题和自己在社区里活跃的这段时间,我发现很多人放弃刷题不是因为能力不够,而是因为心态崩了。
刷题这个事,天然带着“正反馈周期很长”的特点。你刷了十天,可能水平确实涨了,但你自己感觉不出来,因为你每天面对的题还是不会。这种长期缺乏正反馈的状态很容易让人丧失动力。我应对的方法只有一个:不要用“我今天AC了几道”来衡量收获,而要用“我今天搞懂了几道题”来衡量。哪怕今天只做了一道题,但这一道题的解法你完全吃透了、能复述出优化路径了,这一天的刷题就是有效的。反过来,一天AC了十道全是背答案过的,等于没刷。
还有一种常见的心态问题叫“比较焦虑”,混社区的时候总能看到有人发“从零基础到Google三个月”之类的帖子,看多了就容易自我怀疑。我自己的经验是,这类帖子有时候不假,但它的前提条件(每天可投入时间、基础水平、学习效率)跟你完全不是一回事。刷题是一场和自己较劲的长跑,别人跑多快与你无关,你只需要保证今天的自己比昨天多懂一个知识点、少踩一个坑。
最后分享一个我的小习惯:每刷完一道有价值的题,我会去评论区看看别人的解题思路,挑一个最反直觉的点赞,然后记在错题本上。这样过一阵子再翻错题本,我看到的不仅是我自己的成长轨迹,还有整个社区里那些优秀解题者的思路精华。这个习惯让我的刷题过程不那么孤独,也让我在感觉到疲惫时,总能从别人的解法里获得一些新的启发。
