算法手撕两周冲刺,该刷哪些题才划算
临时抱佛脚也有章法。给一份按出现频率排的题型清单,加上白板写代码不慌的口诀。
手撕挂掉的人,多数会写,只是没讲出来
一道手撕题给你二十来分钟,他真正盯着的不是最后跑通的那几行——手撕不是判卷,是让面试官看你解决问题的过程。
你可能遇到过这种情况。题不难,你二十分钟写完了,代码也能跑,结果还是挂了。你想不通哪里出了问题。
问题在于,你从头到尾没说过一句话。面试官看到的是一个人闷头敲了二十分钟,最后说"好了"。他不知道你是想出来的还是背出来的,也不知道你写错的时候会不会自己发现。
他其实在看四件事。
- 你读题的方式:会不会先问边界。数组能不能为空、有没有负数、要返回下标还是数值。不问就动手的人,工作里也容易做错需求。
- 你的兜底能力:想不出最优解的时候,能不能先给一个能跑的版本,再往上优化。
- 你自己找 bug 的能力:写完会不会拿一个小例子手动跑一遍,能不能自己发现越界。
- 你的表达:能不能一边写一边讲清楚在干什么。
同一道题,闷头写对和边讲边写对,在评分表上不是一个分数
理解这一层,你两周的重点就该挪位置了。从堆题量,挪到把解题过程讲出来。
两周只够刷透十类题,按这个顺序来
结论:校招手撕的题型高度集中,十类覆盖掉大部分场次。
按出现频率从高到低排,你的两周就按这个顺序走。
- 双指针与滑动窗口:无重复字符的最长子串、长度最小的子数组、三数之和。这一类几乎场场有。
- 哈希计数:两数之和、字母异位词分组、出现次数前 K 个。写起来快,容易被拿来当开胃题。
- 二分查找:有序数组找插入位置、旋转数组找目标值、求平方根。二分的边界是重灾区,多写几遍闭区间开区间。
- 链表:反转链表、判环、合并两个有序链表、K 个一组翻转。白板上写链表最能看出手感。
- 二叉树:层序遍历、路径总和、最近公共祖先、判断平衡。递归三行能写完的那种最常考。
- 栈:有效括号、最小栈、单调栈求下一个更大元素。
- 排序与 TopK:手写快排和归并,用堆求前 K 大。手写快排被单独拿出来问的次数不少。
- 动态规划入门:爬楼梯、最大子数组和、零钱兑换、编辑距离。四道打底就够应付多数场次。
- 图的搜索:岛屿数量、矩阵里的路径、课程表。本质是 BFS 和 DFS 的模板套用。
- 字符串模拟:字符串转整数、大数相加、压缩字符串。没什么技巧,考的是边界处理细不细。
时间只有两周的话,下面这些直接跳过,不用有心理负担。
- 线段树和树状数组:校招手撕里出现得很少,写起来又长。
- 复杂动态规划:状态压缩、数位 DP、区间 DP,投入产出比很低。
- 图论进阶:最短路、最小生成树、网络流,笔试偶尔见,手撕基本不考。
十四天排成这样,每天两小时就够
给你一份能直接照着执行的排期,不用自己再算。
- 第一到第五天:吃掉前五类。每类三到五道,做完当天把模板默写一遍,不看答案。
- 第六到第九天:第六到第九类。动态规划那天多留一小时,那一类最容易卡。
- 第十天:字符串模拟加复盘。把前九天做错的题挑出来重写,只重写错的那部分。
- 第十一到第十三天:模拟面试。找同学开个共享文档,互相出题,全程必须出声讲,讲不出来就算没做出来。
- 第十四天:把十类的模板各手写一遍,限时。这一天不做新题。
有一条比刷题量更重要:每道题做完,合上答案再从零写一遍。看懂和写出来之间隔着很远的距离,你在面试现场只有写出来这一种状态。
别一天刷二十道
一天二十道刷的是数量感,第二天你一道都想不起来。一天五道,每道做完默写一遍,两周下来你手里有七十道能默写的题,这个量级足够。
每道题分四步说出来,别闷头写
【边写边讲】就四步,顺序别乱:复述、问边界、给暴力、报复杂度。
第一步复述,是为了确认你和他理解的是同一道题。
我复述一下题目:输入是一个整数数组,要我找出和为目标值的两个数,返回它们的下标而不是数值。是这样吗?
第二步问边界,一次问完,别挤牙膏。
我确认几个边界:数组可能为空吗?会有负数吗?元素能重复吗?数据量大概在什么量级?
问完这两句,你已经比一半的人做得好了。而且你在问的这三十秒里,脑子还在继续想解法。
第三步给暴力解。先给一个笨办法,再优化,比憋五分钟不吭声安全得多。
先说个笨办法:两层循环挨个试,时间复杂度 O(n²)。样例肯定能过,但如果数据量到十万就超时了。我想想能不能用哈希把内层这层省掉。
第四步是写完之后报复杂度,顺手说一句空间。这句很短,但不说会显得你没意识。
在共享文档或者白板上写,还有四个小动作要记住。
- 先写签名:函数名、参数、返回类型先写出来,再填函数体。这样你思路乱了也有个骨架。
- 变量名写全:写 left right window,别写一堆 i j k m n,面试官跟不上你就要打断你。
- 手动跑例子:写完拿一个三四个元素的小例子,从头到尾走一遍,出声走。这一步能抓到大部分越界。
- 留空行:代码分块,中间空一行。挤成一坨对方读起来很累。
卡住了先写能跑的,空白比丑代码难看得多
结论:卡住的时候最糟的选择是沉默。
面试官不怕你想不出最优解,他怕的是他不知道你脑子里在发生什么。你沉默五分钟,他只能记一条"思路卡住,无输出"。
卡住时按这个顺序做。
- 把卡点说出来:具体说卡在哪一步,不要笼统说"我再想想"。
- 退回【暴力解】:直接开始写能跑的版本。写着写着思路常常就通了,这是真的。
- 要一个提示:主动要提示不扣分,扭捏半天才要才扣分。
说卡点可以直接抄这句:
我现在卡在重复元素这里。我的想法是先排序再跳过相同的值,但我不确定这样会不会把某些合法组合也跳掉。您觉得这个方向对吗?
对方给了提示之后,接住并复述一遍再往下写。
明白了,您的意思是固定第一个数之后,剩下的用双指针往中间收。那我改一下,外层循环固定 i,里面用左右指针。
还有一种情况:写到一半自己发现写错了。大方改,别偷偷改。
等一下,我这里数组长度小于二的时候会越界,我补一个判断再往下走。
这句话说出来是加分的。他刚好看到了你自己找 bug 的能力。
真写不出来,这么收尾还能捞回一点
先接受一件事:写不出来是常事,题目难度本来就有梯度。
收尾的关键是把你想到的东西全部交出去,别让它烂在肚子里。
按这个说:先说你写出了什么,再说最优解你想到哪一步,最后说卡在哪个具体的点上。
这道我现在写出来的是暴力版本,能跑通样例。最优解我想到应该用单调栈,栈里存下标,遍历的时候把比当前小的弹出来。但弹出的时候怎么算宽度我还没理清。要不我先把暴力版跑一遍,然后讲一下单调栈这条路我的思路?
这段话里有三样东西:一个能跑的产物、一个正确的方向、一个诚实的边界。面试官记下来的就不再是"没做出来"。
面试结束之后还有一次机会,但要用对。
- 当场问方向:面完可以问一句"这道题标准解法大概是什么思路",多数面试官愿意说两句,你也能听出他关注的点。
- 别追着补交:面完回去把题做出来再发给 HR,多数情况没用,还容易显得没分寸。做出来是给你自己下一场用的。
三道题里留一道出声讲完
两周不可能把你变成算法高手。它能做的是让你在面试现场不至于失语。
真正拉开差距的从来不是刷了多少道,是同样一道中等题,你能不能在二十分钟里把想的过程完整交出去。这件事练三天就有明显变化。
今晚只做一件:打开滑动窗口这一类,做三道。前两道随便做,第三道找个没人的地方,出声把整个过程讲一遍,从复述题目开始讲。
你会发现自己讲得磕磕巴巴。这就对了,这正是面试当天要暴露的东西,提前暴露一次就少一次。