很早就听说“面试150”是不少人备战算法面试的标配,但真正自己刷到第七周才发现,这个阶段和前面几周完全不同——它不再考查你“会不会背某类模板”,而在检验你“能不能在陌生题面前稳住思路”。第七周恰恰是大多数人容易中途放弃的节点,前几周的新鲜感已经耗尽,刷题手感又卡在“一看就会、一写就废”的瓶颈。这篇文章就聊聊我在第七周的实际感受、踩过的坑,以及一套可以照抄的执行方案,给同样在坚持刷“面试150”的朋友一点参考。
前六周把数组、链表、哈希表、二叉树这些基础轮完之后,第七周内容普遍开始进入综合题和偏难题,比如回溯、DP进阶、复杂区间处理、双指针的变体。这些题目不再是单一技巧能解决的,面试中问到的可能性反而比基础题更大,因为面试官想知道你能不能把零散的知识点串起来。同时,第七周也更需要你自己安排节奏,因为很多人在这一步陷入“盲目刷题,不复盘”的恶性循环。
1. 面试150的第七周:这一阶段在整体计划中的位置与打法
1.1 为什么第七周最容易让人放弃,或者说最容易让人“白刷”
我自己体会下来,第七周有一个很隐蔽的陷阱:知识量开始叠加。前面的题目,看到数组就能想到双指针,看到链表就能想到dummy节点,套路相对固定;但到了第七周,题目往往同时涉及排序、去重、hash统计和边界收缩,没有一道题是“单一技巧”能解的。这种情况下,单纯增加刷题数量已经无法形成进步,反而会不断打击信心。
我第一次刷到第七周时,一度觉得自己“不会做题了”。后来复盘发现,问题不是我不会,而是没有转换策略:前六周是在学“知识点”,第七周开始是在练“题感”。题感这东西,没法靠看题解获得,必须靠限时训练和反复总结。如果不建立一套针对“综合题”的打法,很容易陷入“这道题见过,但当时怎么写来着”的尴尬状态。
第七周真正要做的,不是再做150道新题,而是把前面会的东西“压迫”出反应速度。我当时给自己定的目标是:不看标签、不看提示、不看题解,先能在25分钟内写出一版有思路但可能不完美的解。这个目标比“做完多少题”现实得多,也更能模拟面试状态。
1.2 第七周的复习范围如何划定:集中轰炸还是穿插推进
有人喜欢第七周专门找一个薄弱板块猛攻,比如一周全做回溯;也有人喜欢每天按“1道旧知识点+3道新综合题”的节奏穿插。两种我都试过,最后偏向后者,原因是综合题对多个知识模块的熟练度要求很高,如果一周只看回溯,其他模块的状态会掉得很快。
我第七周的分配思路是这样的:周一到周四每天精做4道题,其中2道是新题,2道是前几周已经做过的旧题重写。旧题重写不是默写,而是遮住题解和曾经提交的代码,从头写起,写完再对照哪里不一致。周五和周六做一次“模拟面试套餐”,固定在上午九点半开始,把一套题控制在90分钟内,用手机秒表倒计时,尽量还原面试压力。周日只做一件事:把这一周所有做错或者超时的题目统一过一遍,按照“题型+错因+正确思路”三个维度整理进一张表格。
这个组合让我在第七周结束时,不仅没有丢掉前面的基础,反而在综合题上找到了手感。你可以根据自己前面的薄弱点调整新旧题比例,比如链表不熟就多插一天重写快慢指针,但不要连续一周只做同一类题,那对面试帮助不大。
2. 第七周常见题型归类与解题框架拆解
2.1 回溯与状态重置:不画递归树基本做不对
第七周大概率会碰到比较深入的回溯题,比如排列、组合、子集、分割,以及它们在“去重”条件下的变体。回溯本身不难理解,难在两件事:一是递归状态怎么恢复,二是重复解怎么剪掉。
先说状态重置。我见过很多朋友写着写着,把临时数组里的元素清空得乱七八糟,要么漏了pop,要么clear得太早。建议所有用回溯的题,都遵循一套固定动作:标记使用 -> 递归 -> 撤销标记。这套动作写在代码里就是对称的,比如添加路径和弹出路径在结构上必须成对。每次写完后,可以自己在脑海里跑一遍递归树的最小分支,确保reset逻辑没有漏。
去重方面,最常见的是“同层去重”和“同枝去重”的区别。同层去重主要防止出现“1,2”和“2,1”这种排列里重复的枝;同枝去重防止同一个元素被用两次。一个很实用的判断方法是:看题目允许结果无序还是有序、允许重复元素还是不允许。如果允许重复元素但结果不能重复,通常需要先排序再用同层去重;如果不允许重复元素,可以用visited数组或set标记同枝状态。
如果你把回溯题当成“暴力枚举优化版”去理解,心态会好很多。第七周做这类题的关键,不是追求写出最优解,而是保证在25分钟内能画出清晰的搜索树并且代码不出错。哪怕当时的解不是复杂度最优,面试中也比“只会背模板,一改边界就死”强百倍。
2.2 动态规划的进阶状态定义:从“会写”到“会猜”
第七周的动态规划,大概率不满足于斐波那契、爬楼梯这类简单递推了,而是会碰到“二维状态”“带有选择的DP”“需要看清状态的转移方向”等题目。这类题最典型的特点是:如果你把状态定义对了,代码也许只要十行;定义错了,怎么写都过不去。
我的经验是,状态定义里一定要包含“截至目前”这个意思,然后想清楚当前这一步依赖的是哪一步。比如背包类问题,状态行代表的是“前i件物品中选若干件,容量为j时的最大价值”,后面的转移就是拿或不拿。再比如区间DP,重点是考虑最后一步操作的是哪一段区间,然后分成左右两半递归求解。
第七周很多人死在“对拍样例就错”,其实是状态定义里漏掉了题目中的限制条件。例如题目中限制“不能连续选取”,你状态里顶多需要多一个维度的布尔字段来记录上一步是否被选中,但如果不加,样例看起来没事,改成长用例就会炸。每定义一个DP之前,可以先用一个小例子手动跑一遍,看状态是否覆盖了所有决策分支。
另外,第七周还适合检验一下自己有没有“DP模板化依赖症”。如果你看到题,脑子里只有“定长度”“开二维”“找最大”,说明还没有形成从题目场景推导状态的能力。这个能力在面试现场非常宝贵,如果自己练,可以在每道DP题后面加写两句话:一句写“为什么是这个状态”,另一句写“如果换一种状态定义行不行”,坚持一个星期,状态定义的敏感度会上来很多。
2.3 区间合并与滑动窗口:边界条件就是得分点
第七周的综合题里,区间合并和滑动窗口这类“边界密集型”题也经常出现。它们的难点不是思路,而是把边界写对。比如区间合并,最简单的做法是排序后逐个比较,但比较条件到底是“当前段的开始 > 已有段的结束”还是“大于等于”,会直接影响结果。
我的习惯是先把“判断是否相交”这个条件单独抽成一个函数,然后在函数里把所有可能情况列清楚:相交包括“完全包含”和“部分重叠”,也包括“相邻但不重叠”这种边界。实际调试时,用一组区间列表手工跑一遍,能提前发现很多隐藏条件。还有区间题的排序,一定要写清楚是“按开始升序,开始相同按结束升序”,否则后续合并逻辑会乱。
滑动窗口的重点则不在于窗口本身,而在于什么时候收缩窗口、什么时候更新答案。如果题目要的是“最长子串”,窗口收缩条件可能是“出现重复字母”;如果题目要的是“最小覆盖子串”,收缩条件则可能是“当前窗口已经包含全部目标字符”。每次移动右边界时更新状态,满足条件后尝试收缩左边界并更新答案。我见过的错误大多是更新答案的位置不对:要么只在收缩后更新,要么只在扩张后更新,导致一个Case漏解。
这类题特别适合用“固定模板+可变条件”的方式训练。先写死一个窗口框架:右边界遍历、维护状态、尝试左边界收缩、更新答案。然后把不同题目的差异只塞进“维护状态”和“收缩条件”两个部分。到第七周最后几天,一看到滑动窗口,就直接在纸上画这个框架,完全不需要临时想结构。
3. 第七周实操记录:我在一周内如何执行和调整
3.1 每日执行方案与时间分配:从盲目堆量到精确控制
第七周要想有质量地完成,不能没有安排。我给自己定的每天刷题窗口是晚上八点到十点半,全神贯注,不看手机,不划水。第一个小时用来做新题,第二个小时完成旧题重写和错题整理。具体分工可以参照下面这张表,在不同时间点执行的目标完全不同,大块时间不要盲目堆量。
| 时段 | 任务 | 具体目标 |
|---|---|---|
| 20:00 - 20:45 | 新题限时 | 在没有提示的情况下,25分钟尝试写出一版可行解 |
| 20:45 - 21:00 | 短复盘 | 对照题解差距,记录卡壳环节 |
| 21:00 - 21:45 | 旧题重写 | 遮挡上次代码,写出至少2道前几周的题 |
| 21:45 - 22:30 | 错题归仓 | 整理当天错因,更新问题清单 |
这个安排的核心,是把“新题”和“旧题”隔离成两个时间块。如果先做旧题再写新题,容易形成惯性思维;先做新题能模拟面试的应激反应。实际操作下来,效率比之前瞎刷高了很多,因为每一段时间都有明确的目标,也就不容易因为一道难题卡住浪费整个晚上。
有个朋友问我,为什么晚上下班后还能坚持这么长时间。说实话,第七周的状态肯定不如第一周,但关键是“开始动作”要足够轻。我把所有东西提前准备好,到点直接坐在电脑前,做的第一件事不是打开题测,而是默写一遍最近三天整理过的解题框架口述稿,相当于热身。一套熟练的动作下来,身体会自动进入状态。
3.2 模拟面试实操:90分钟套餐带来的真实反馈
周末的模拟面试是我第七周最受益的环节,比做十道新题都有用。我在周六上午给自己布置了一套自拟的“综合套餐”:两道中等题、一道困难题,限时90分钟,全程不开题解、不看讨论区,也没看标签。
第一道题是典型的“状态设计+边界处理”类题目,我用了20分钟完成,思路很顺。第二道题涉及数据结构的组合,我一开始想偏了,来回改了三次才把边界理顺,耗时偏长,但至少最后代码逻辑是对的。第三道题属于“思路见过、代码不熟”的类型,我在45分钟的时限内只写出了半解,时间到的时候手都在抖,因为真实面试那种紧张感会放大不熟练的地方。
做完之后我做的第一件事不是评判对错,而是给自己写“现场诊断记录”:第一题为什么能秒?因为前两天刚重写过类似的旧题,说明存量复习有效。第二题为什么卡?因为我在状态定义和边界条件之间来回犹豫,真正的错因还不是不会,而是没有在一开始就列出边界Case清单。第三题为什么写不完?很坦率地说,是平时练这类题时的练习量不够,总觉得自己“看懂了”但没“写熟”。
如果你也在刷面试150,第七周建议至少做一次这样的模拟,别管是周末的哪个半天。真正的面试压力在于“当场联想相似题目”能力和“不完美状态下完成任务”能力,这两件事只有模拟才能训练。没有计时环境的刷题,只能叫练习,不能叫备考。
3.3 周日错题归仓:一周的收获都藏在错误里
周日不写新题,这是我第七周立下的规矩,也是执行得最彻底的一条。前面六周我周日也刷题,刷完发现下周学到的新东西并不比周中多,因为大脑没有时间消化。第七周改成“归仓日”,把一周的错题和超时题全部拿出来,按下面的表格整理,效果立刻不一样。
| 题目特征 | 错因分类 | 动作 |
|---|---|---|
| 回溯去重漏了同层剪枝 | 模板细节不熟 | 重写一次并手画递归树 |
| DP状态定义偏差 | 状态含义理解偏差 | 写“为什么选这个状态”的笔记 |
| 滑动窗口更新答案位置不对 | 模板和场景不匹配 | 用最简单Case手动跑一遍全流程 |
| 字符串处理边界漏了空串 | 边界考虑不全 | 增加边界Case清单并保存到错题集 |
错题归仓不是让你把所有代码再看一遍,而是把每道错题的“错误类型”归纳到大类里去。到了第七周,你会发现大部分错误集中在一两个大类里。比如我的大类是“回溯去重”和“DP状态定义”,这就说明后续不用继续扩大题目范围,只需要针对这两个大类各找几道近似的题进行限时专项训练即可。
整理时我还会顺手给每周题目编号,比如“W7-02”,然后在题解旁边写“何时再刷”——大多数写的是“一周后”,少数特别典型的写“三天后”。这样到了第八周,我一眼就能知道哪些题需要优先复习。如果你能做到这一步,就摆脱了“刷过等于会做”的假象,进入了真实的掌握阶段。
4. 第七周专题:常见问题与排查技巧速查
4.1 刷了很多题,但脑子还是“空”的
第七周最常见的抱怨就是“明明做了很多题,怎么碰到新题还是没思路”。出现这种情况,通常不是因为刷得不够,而是缺少两件东西:归类系统和针对弱项的刻意练习。
归类系统就是你在第七周之前,就必须把“见过的题”按考点、题型、使用场景卡片化整理。比如看到“求最长窗口”,你要习惯性地关联“滑动窗口”和“单调队列”,看到“字符串是否可由字典拼接”就跳向“动态规划或记忆化DFS”。没有这个映射,每道题都是孤零零的例子,自然很难迁移到新场景。
刻意练习则是针对自己的弱项,而不是永远捡软柿子捏。我第七周单独抽出两个晚上,只刷回溯去重相关题型,不碰其他题。每次做完回顾一下“去重条件是从排序来还是从visited标记来”,两天后,这个考点的质变非常明显。想摆脱“脑子空”,这两个缺一环都不行。
4.2 一题多解时,面试到底该讲哪一种
第七周的题目往往有多个解法,比如哈希计数、排序双指针、二分答案等,很多人纠结面试时“哪种才是最优解”。我的看法是:面试讲的应是“你首先能想到的、复杂度合适的解”,然后主动提一句“还有更优方案,但当前先实现这个”。
当然,如果你面对的是一道模板型中等题,建议在15分钟内让一下:直接讲最优解会让面试官觉得你准备充分。而对于第七周阶段的“偏难题”,先给出一个可运行的正确解比“追求最优但写不出来”好一百倍。面试官更关心你的思维过程,而不是只看复杂度。
所以平时练题时也不需要强行记住每个解法的优化版本,但至少要能说出“为什么暴力解复杂度高”“换成哈希/排序能优化在哪一步”。这个“能说清楚取舍”的能力,恰恰是第七周多题同解的题中最该学会的东西。
4.3 看题解五分钟,代码写两小时
还有一群人卡在“看题解已经懂了,但关掉题解自己写就白纸”。这不是学习态度问题,而是“被动理解”与“主动实现”的差距。第七周最适合修正这个习惯:把看题解的时间改成“看思路概括”“看复杂度目标”,然后自己补全代码细节。
具体方案是:先看题解中的前五句话,只看“用什么方法”“状态怎么定义”“关键判断条件是什么”,接着就把题解关掉,自己开始写。第二十三分钟写不出来,再回来看特定片段,而不是从头看一遍。这样做一方面保留了思考量,另一方面也让题解的“拐杖”逐步变细。
我在第七周看题解的原则是:每次最多看三句话,所有核心逻辑必须自己落笔。几天之后,写代码时那种“对着题解才能写”的依赖感会下降很多。也许你不是“不会写”,只是被“现成答案”养懒了。
4.4 时间不够,如何保证一个月后的手感
第七周每天的刷题时长如果实在凑不出来,我建议优先压缩“新题量”,保留“重写旧题”环节。哪怕晚上只有45分钟,也宁可写两道前几周的高频题,也不要写四道新题然后草草对题解。
因为面试时最能给你信心的,往往是已经做过的、反复写过的“个人题库”。你会隐隐记住“这道题用双指针”“那个边界加个判断”,这些在面试中出现时几乎等于送分题。第七周的重写旧题,就是利用“间隔复习”原理,把短期印象转化为长期记忆。
如果时间真的紧张,还可以把一些简单题的“口述解法”变成通勤时的音频或文字笔记,而不是手打代码。比如在脑子里把关键步骤过一遍,相当于一次“模拟面试口述”。别小看这个动作,它能把碎片时间变成重复记忆的训练场。
4.5 心态崩了怎么办:允许自己写不快
第七周很多人心态崩,不是因为题难,而是因为“对进步的感受变淡”。前几周每天都能做出几道新题,成就感显而易见;到第七周,做三道题也许错两道,心态很容易崩。
我对付这种状态的办法很简单:给自己定“过程指标”而不是“结果指标”。比如今天的指标是“能用双指针想出一种解法,并且说出复杂度”,而不是“提交通过”。这种指标不依赖结果,也不会每次都让你失望。连续几周坚持下来,你回顾时就会发现,虽然单日成功率不高,但整体解题思路的瓶颈一次比一次低。
我也在第七周允许自己“写不快”。如果一道题明显超时且没有思路,我会主动停笔,在笔记里写“现有思路是XX,卡在XX,需要补的是XX”,然后去做别的题。第二天回来再看,往往很快就有切入点。这个“搁置再回看”的过程,跟面试中卡住后重新审题的感觉很像,练多了,应对面试卡壳时也会更淡定。
5. 第七周收尾心得与后续安排
第七周刷完,我做了一件之前六周都没做过的事:把前七周的错题清单全部打印出来,找了一天晚上按“题型”分类,又按“远近”排序。离今天近的题,优先限时重写;离今天远的题,只翻看“错因”和“解题思路一句话”。这相当于一次“总复习前的扫描”,让我心里非常有底。
另外,第七周我还发现“讲题”是很好的检验方式。每做完一道关键题,我可以试着把思路讲给一个完全不懂算法的人听。如果他能听懂,说明我的思路是真的清楚;如果讲着讲着自己都绕回去,那说明这个知识点还需要下沉。这个习惯不需要额外时间,只要在做题后花五分钟自言自语即可。
如果你现在正处在第七周,或者还没有开始第七周,我的建议是不要贪多求快。把“每周通关”从“做了多少道题”改写成“建立并完善了多大规模的错题体系”,这个转变虽然慢,但会让你的准备真正可持续。后面几周的强度只会更高,第七周养成的这套节奏,远比你多刷十几道题珍贵。