面试手撕现场
手写题考的不只是代码 —— 同一个答案,有的人拿「思路清晰、边界严谨」,有的人拿「写完了但不敢说话」。 这一页讲过程,代码模板在 手写题清单。
三个阶段的节奏
0–1 分钟 读题 + 确认(别急着写)
1–3 分钟 说思路 + 复杂度(面试官点头再动手)
3–12 分钟 写代码(边写边讲)
12–15 分钟 自查边界 + 手跑一个例子0–1 分钟 读题 + 确认(别急着写)
1–3 分钟 说思路 + 复杂度(面试官点头再动手)
3–12 分钟 写代码(边写边讲)
12–15 分钟 自查边界 + 手跑一个例子最忌讳:一言不发直接写,写了 10 分钟发现方向错了。
一、读题与确认(0–1 分钟)
把题复述一遍,然后问三个问题:
| 问什么 | 为什么问 |
|---|---|
| 「输入规模大概多大?」 | 决定能不能 O(n²),要不要用哈希/堆 |
| 「有没有重复元素 / 负数 / 空输入?」 | 直接决定边界处理 |
| 「返回下标还是返回值?可以修改原数组吗?」 | 这两点搞错,代码白写 |
复述模板:
「我理解一下:给一个有序数组和一个 target,返回两个数的下标,保证有且只有一个答案,对吗?数组长度大概多少?可以有重复值吗?」
二、说思路(1–3 分钟)
先给一句结论,再展开:
「这题我用双指针,因为数组有序。左指针从头、右指针从尾,和大于 target 就右指针左移,小于就左指针右移。时间 O(n),空间 O(1)。」
三句话结构:用什么方法 → 为什么(利用了题目什么性质)→ 复杂度。
如果想到两个方案,主动比较:
「暴力是 O(n²),用哈希表可以降到 O(n) 但要多 O(n) 空间。我倾向哈希,除非你希望空间 O(1)。」
三、写代码(3–12 分钟)
先写骨架
java
public int[] twoSum(int[] nums, int target) {
// 1. 边界
// 2. 主逻辑
// 3. 返回
}public int[] twoSum(int[] nums, int target) {
// 1. 边界
// 2. 主逻辑
// 3. 返回
}把注释写上,再填内容 —— 面试官能看出你的结构感。
边写边说
不需要解说每一行,但要在关键决策处出声:
- 「这里我用
long防止溢出」 - 「这里先判空,否则下面会 NPE」
- 「这个变量我叫
prev/cur,方便对照」
命名与格式
- 用有意义的名字:
left/right、slow/fast、prev/cur - 别写一行 200 字符,该换行就换行
- 循环里别做重复计算(
a.length提到外面)
四、卡住了怎么办
| 卡在哪 | 说什么 / 做什么 |
|---|---|
| 没思路 | 「我先写一个暴力解,再看能不能优化」—— 暴力解也是分 |
| 边界想不清 | 举一个最小例子,手动走一遍 |
| 写到一半发现错了 | 直接说「我这里逻辑有问题,我换个思路」,不要硬改 |
| 忘了 API 名 | 「这个方法我记不清名字,假设它叫 findFirst,作用是……」 |
主动示弱比沉默好:面试官愿意给提示,但你不说话他就没法给。
五、写完必须自查(12–15 分钟)
按顺序过一遍,出声:
「我先检查一下边界:
空数组 —— 我这里有 length 判断,返回 -1,OK。
单元素 —— 循环进不去,返回 -1,OK。
全相同元素 —— 我用的是 >=,会跳过,OK。
然后手跑一个例子:nums=[2,7,11,15], target=9
l=0,r=3: 2+15=17 > 9,r-- → r=2
l=0,r=2: 2+11=13 > 9,r-- → r=1
l=0,r=1: 2+7=9,返回 [0,1],对了。」「我先检查一下边界:
空数组 —— 我这里有 length 判断,返回 -1,OK。
单元素 —— 循环进不去,返回 -1,OK。
全相同元素 —— 我用的是 >=,会跳过,OK。
然后手跑一个例子:nums=[2,7,11,15], target=9
l=0,r=3: 2+15=17 > 9,r-- → r=2
l=0,r=2: 2+11=13 > 9,r-- → r=1
l=0,r=1: 2+7=9,返回 [0,1],对了。」这一段是加分最多的地方,很多人写完就停,白白丢掉。
六、常见追问(准备这四个方向)
| 追问 | 准备什么 |
|---|---|
| 能不能优化时间/空间? | 每道题想一个「次优解」:哈希换时间、双指针省空间 |
| 数据量变大到 1 亿怎么办? | 外部排序 / 分治 / 布隆过滤器 / 只存 TopK |
| 并发场景怎么改? | 加锁粒度、无锁 CAS、分段(参考 JUC 并发编程) |
| 异常输入怎么办? | 参数校验、快速失败、返回明确错误 |
七、几个真实的坑
- 不要用 IDE 的自动补全(共享编辑器里可能没有);写
fori循环时手写完整。 - 不要在纸上写省略号(
...),面试官会以为你没想清楚。 - 不要提前说「这题我做过」,除非你能立刻写出并解释;说了却卡住更扣分。
- 时间到了没写完:主动说「剩下的部分是 XX,我口述一下」—— 比沉默收尾好。
一句话总结
手撕题的评分表通常是:边界 30% + 思路 30% + 代码正确 30% + 沟通 10%。 也就是说,代码没一次写对,只要边界和思路清楚,仍然能过。
Cao Note