“力扣每日9”这个说法,我每次讲出来都有人误会成“每日一题已经坚持到第9天”。其实我真正执行的是:每天在力扣上精做9道题,而且不是随机点开排行榜,是有一套自己搭的节奏。这个计划我坚持了差不多两个月,最大的感受是:它治好了我长期“刷题三天打鱼两天晒网”的老毛病,也让我的算法手感稳定在了随时能上场的状态。
如果你也在准备技术面试,或者单纯想把算法能力维持在一个可控水平,这篇总结应该能给你一些可以直接照搬的东西。我会把为什么选9道、每天怎么搭配题目、刷完之后怎么沉淀、中途踩了哪些坑、以及最后怎么把这个节奏变成长效习惯,全部摊开讲一遍。全程没有玄学,都是我自己试过、调整过、最后留下来的做法。
1. 为什么把频率定在每天9道:这个数字背后的取舍
1.1 单题深挖和数量滚动,我都试过,问题出在哪
最早我刷题特别用力,休息日一天只磕一道困难题,从早到晚盯着一道题,看题解、看讨论、反复改代码。效果不能说没有,但情绪消耗极大,经常一道题没做出来,整个人像被打了一顿,第二天一点都不想打开力扣。这种“单题深挖流”最致命的问题是:如果当天选题难度判断失误,等于浪费了一整天的窗口期,而算法能力的维持恰恰需要每天接触足够多的不同模式。
后来我又走向另一个极端,每天冲刺20道题。这个效率看着吓人,但坚持了几天就发现变味了,特别容易变成“先看题解再装模作样写一遍”的假动作。20道题的题量意味着我几乎没有时间复盘,很多题做完二十分钟就想不起它的解法核心是什么,纯粹变成了计数游戏。
9道这个数字是我试了一圈之后算出来的。按我自己的速度,一道中等题从读题到跑通大概需要10到15分钟,简单题快的话5分钟。9道题里混着简单、中等、困难,总耗时基本落在1.5到2小时,刚好是一个工作日晚上的可控区间,不会影响到睡觉,也不至于每天都处在“来不及做完”的焦虑里。这个数字还有一个好处:足够形成滚动节奏。题目太少,比如每天3道,一周只能覆盖二十来个知识点,遇到稍偏的题型很容易遗漏;9道的话,配合分组刷法,两周内基本能把一个主题的常见变体全部过一遍。
1.2 每天的9道额度,我是这样分配难度的
我的默认配比是3道简单题、4道中等题、2道困难题。这不是随便拍的,是有明确功能的。
3道简单题用来热身,写起来不费脑,关键是找回手感,顺便恢复几种基础数据结构的肌肉记忆。4道中等题是每天的核心产出,大部分新题型、新套路都在这个区间掌握。剩下的2道困难题,我不指望当场独立AC,它们的价值是让我接触那些综合了多个知识点的题目,哪怕看完题解只能吸收一小部分,也能在脑子里留下一个“高级解法”的索引。
当然这个配比不是死的。如果当天状态特别差,我会把困难题减到1道,把中等题加到5道;如果晚上精神很好,就反过来多拿一道困难题冲刺。硬性底线只有一个:9道里至少要有5道是中等及以上难度。一旦这条线被破坏,执行几天之后人就会自动退化到“只刷简单题自嗨”的模式。
提醒一下:如果你刚开始尝试每日9,第一周不要追求全部AC,更不要追求“独立AC率”。把目标定成“每道题都真正理解,写下思路标签”,比AC数重要得多。
2. 一揽子9道题的具体搭配:从随机刷变成主题制
2.1 当天的题包不是随机抽的,是按“同类型重复”组的
我以前刷题有个典型问题:打开力扣,随便点,今天碰巧遇到滑动窗口就做滑动窗口,明天遇到链表就做链表,一周下来知识点七零八落。后来我改成主题式刷题,效果差距非常大。
具体做法是:每周只设一个主攻主题,比如这一周是“前缀和”。那么周一、周三、周五这几天,9道题里的5道必须围绕前缀和的变体来选——连续数组、二维矩阵前缀、前缀和加哈希表这些子类型各来一道。剩下2道用来刷上一周的主题,叫保温题;再剩下2道完全随机,用来锻炼面对陌生题的审题反应。
同类型重复是让9道题产生复利的关键。大脑特别擅长在相近的题目里提取共同模式,一道两道可能只是会做,到第四道第五道时你会突然发现自己能预判这类题的命题方向了。这种“熟悉的题感”是散着刷题很难积累出来的。我印象特别深的是刷“区间合并”系列,第一天还对排序后的边界判断模模糊糊,第三天做到同主题变体时,同一个坑连着踩三次,之后几乎再也没错过。
2.2 动手前先做5分钟“审题筛选”,别和一道题死磕
每天拿到9道题,我不会直接埋头写代码。先花五分钟把它们全部过一遍,按思路清晰程度分成三类:读题之后立刻有想法的、模模糊糊有点印象的、完全没头绪的。
第一类直接写,作为热身。第二类我会先合上题目自己在白板上把思路推一遍,推对了再敲代码,推不出来就说明之前只是“见过”不是“会了”,这类题最有复习价值。第三类完全没思路的,我不会硬扛超过二十分钟。看题解不等于失败,我给自己定的策略是:最先看题解的思路提示部分,不看代码,看完之后合上题解,凭理解自己写一遍。
这个筛选机制帮我省了很多无谓的内耗。以前一道道顺着做,遇到一道卡住的就会破坏整晚状态,后面八道题全都心不在焉。现在先筛一遍,等于把当天的心理难度做了排序,从最容易的下手,越写越有状态,后面再碰难题时整个脑子都是热的。
2.3 一个反常识的规则:同一道题三天内不要重复做
这句话听起来有点怪,毕竟大部分建议都是“要及时复习”。但我发现,如果把一道题在当天搞清楚之后,第二天或第三天又拿出来原封不动重做,会出现一种“熟练度假象”:你确实记住了答案,但记住的是步骤顺序,不是真正的解法推导。这会让复盘变得毫无意义。
所以我给自己定了个规矩:原题三天内不做,要做就做同类变体。比如今天做的是“两数之和”,三天后我会找一个三数之和、四数之和或者变种题来做。同样是哈希表的思路,但具体场景变了,这时候还能顺利做出来,才说明我是真的理解了这类题的信息组织方式,而不是背住了某个特定数组的答案。
3. 让9道题里每一道都沉淀下来:错题整理和模式归档
3.1 用“模式标签表”代替错题本
我发现大多数人刷完题就结束了,最多点个收藏,以为以后会回来复习。事实上收藏夹只会越攒越长,最后看都不会看。我用了一个特别轻量的方式:本地维护一个表格,每一行是一道题,列分别是日期、主题、难度、是否独立AC、卡点、一句话模式。
这里最关键的是“一句话模式”这一列。它逼着我在每道题做完后,用不超过二十个字总结出这道题的解题本质。举两个我实际写的例子:“连续子数组问题优先想前缀和+哈希表”“链表操作先置哑节点再考虑边界”。这个总结不能抄官方题解,必须是我自己想明白之后再写下来的。这种输出要求本身,比刷题环节更能检验我到底懂没懂。
卡点这一列也很有用。我也会记录“想到了前缀和但没处理好负数取模”这种具体到一行代码的问题。刷题两周后再回头看这些卡点,你会非常清晰地看到自己在哪个环节容易出问题,而这是只看AC记录完全看不出来的。
3.2 每周挑一个晚上,做一次“不写代码复述”
每周日是我的复盘日,白天正常做9道题,晚上加练一个30分钟的环节:从本周刷过的题目里挑出5道,不打开代码,纯用口述的方式把解题流程讲一遍。比如这题的状态怎么定义、转移方程怎么写、双指针的移动条件和终止条件是什么、边界输入会踩什么坑。
这个环节一开始让我很尴尬,因为很多题我明明AC过,合上题解竟然讲不清逻辑。口述的时候会卡住的地方,就是我对这题理解断线的地方,这些知识点如果面试考到,大概率也会断线。通过每周一轮复述,我能把“会写但不懂”的题目筛出来,下一周优先用同类变体重刷。大概三周之后,我在复述环节的卡壳率从六成降到了一成左右。
3.3 每题抽一条“可迁移规则”,比抄十道题解有用
到了第九周,我发现真正让我进步的不是刷题的数量,而是从题目里抽出来的可迁移规则。举几个例子:看到“最值”两个字先思考问题有没有单调性,有单调性就优先考虑二分;看到“子数组”先想前缀和或者滑动窗口,而不是直接暴力;看到树上的路径问题,先想怎么把路径拆成分成两段来处理。
这些规则的来源都是每天那9道题里总结出来的。做题时多花一分钟想想“这道题如果换个马甲,我还能不能认出来”,比急着做下一道题更有价值。我甚至到后面会把新题和旧规则做对照,写代码前先写下这条题对应哪条规则。这样下来,每天虽然只做9道,但每道题都在给后续题目储备弹药。
4. 连续两周后踩过的真实坑:疲劳、伪勤奋和边际递减
4.1 最大的坑:为了凑9道,开始猛刷简单题
每日9计划进行到第二周的时候,我明显感到疲劳,于是脑子里冒出来一个危险的念头:反正今天要完成9道,那挑点简单的做完就算交差。第三天我刷了七道简单题加两道中等题,AC率还挺漂亮,但当天晚上整理笔记时发现,七道简单题里没有一道带出新的模式标签。这一天才真正算“白刷了”。
发现问题后我立了一条铁律:每天9道的难度下限要卡死,简单题最多占3道,其中还要有一道是我之前不会、忽然一点通的老难题。简单题只能当热身,绝不允许当任务量。这条规则救了整个计划,从此每天的完成感来自“今天又啃下几道中等以上题目”,而不是“今晚又打了9次卡”。
4.2 第二个坑:时间不够时硬要扛完
有一天晚上项目出了状况,处理完回到电脑前已经十一点半。按原计划,9道题全部做完至少要一个半小时,那就得熬到凌晨一点。当时我选择硬扛,结果精神状态极差,连简单的链表反转都写了半天,两道困难题完全看不进题解,第二天起来回忆昨晚到底学到了什么,脑子一片空白,那种亏大了的感觉特别强烈。
后来我跟自己和解了:一旦过了晚上十一点还没开始刷,自动把当天的9道降级为3道,而且只做中等难度的旧题复习。理由是,当天学习窗口已经关闭,这时候最重要的不是数量,而是保持“不断签”的惯性。第二天状态恢复,再正常执行9道。这个弹性设计保住的是长期节奏,而不是某一天的面子。
4.3 第三个坑:只刷新题,旧题失去联动
连续猛刷两周新题后,我发现自己做过的题没有形成一个网络。做前缀和时不需要链表技巧,做链表时用不上动态规划,每道题孤立存着,效率很低。真正让我有变化的是把“新题+保温题”绑在一起:每天9道里固定塞进两道一周前主攻主题的题目,强制把新旧知识点连起来。
后来我又进一步,把每周的第一天设置为“纯复习日”:当天9道题全部来自过去两周刷过的旧题,但题目要求做一定修改,比如改时间复杂度的限制,要求你换一种更优解法重新实现。这个日子虽然被很多人看作浪费时间,但恰恰是它逼着我把旧知识从短期记忆搬进了长期记忆,之后见新题时调用套路的反应速度明显变快了。
5. 把每日9坚持到第二个月的操作细节:工具、节奏和心态
5.1 我用到的轻量配套:一张表格和一个倒计时
工具上我没用任何复杂的刷题管理软件,就是一个本地表格软件加一个网页闹钟。表格字段上面说过:日期、主题、难度、是否独立AC、卡点、一句话模式。每天刷完题花五分钟填好,这五分钟就是最简单的复盘。
计时方面我给自己定的是单题20分钟倒计时。贪心、双指针、动态规划这些中等问题上如果超过20分钟还没有一点思路,我不会继续干耗,而是直接看题解的前半段思路提示,合上之后自己补完后面的实现。这个做法比看全解更能保留独立思考的成分,也避免了在一道题上死磕导致整晚报废。用倒计时还有个隐藏好处:它会让刷题变得像限时训练,强迫自己快速判断“这题我该投入多久”,这种判断力在面试现场非常值钱。
5.2 每日9在面试和工程场景里的真实收益
面试方面的收益是最直接的。高频考察的套路:滑动窗口、前缀和、单调栈、二分答案、背包变体、区间DP,这些因为我用主题制反复刷过,基本做到“看到特征就能锁定思路”。特别是针对“是否独立AC”做统计之后,我很清楚自己的弱项在哪,可以提前针对性补。日常开发中的收益则更隐蔽,但也更持久:每天面对复杂的代码逻辑,我养成了先写清楚“输入、边界、状态”再动手的习惯,代码的可读性和健壮性都有提升。
有一点要说清楚,每日9不是万能药。它的核心价值是让你保持稳定接触算法,不至于考前临时抱佛脚。如果你想靠它冲击顶级比赛的排名,或者深入研究某个偏门算法方向,那需要换一套完全不同的练习框架。对我来说,它是一个性价比极高的“手感维持器”。
5.3 如果某天彻底断了怎么办:我的恢复方案
坚持的过程中总有断掉的时候,比如出差一整天,比如生病,比如家里临时有事。最开始我很焦虑,总想着第二天把前一天没做的9道题补回来,结果不仅没补上,还把原定计划挤得变形。后来我彻底放弃“补签”这个念头,断了就断了,第二天照常执行当天的9道题,最多在主题选择上稍微放低一点难度。
我还允许自己每周设一个“0题休息日”,不刷任何新题,纯粹看几篇题解或者整理本周的模式标签。提前安排好这个休息日,会让心里那根弦不用一直绷着,反而更容易长期坚持。最后一条底线是:连续断签不允许超过3天。这条线一旦越过去,惰性就会迅速接管。只要控制在这个范围内,每日9的复利曲线就不会断掉。
如果要把这套东西压缩成一句话,那就是:每天9道题,按主题重复,用标签沉淀,允许弹性,别让完美主义毁掉连续性的价值。我实操到现在的体会是,强大的习惯从来不是靠意志力硬扛出来的,而是靠一套允许偷懒、允许失误但仍然能回到正轨的设计跑起来的。这个节奏我已经跑了两个月,后续还想把单位从“天”拉长到“三天为一个周期”,做27道题的更大主题包,如果你也在摸索自己的刷题频率,可以从9这个数字开始试试,然后调出属于你自己的版本。