Skip to content

面试手撕现场 ​

手写题考的不只是代码 —— 同一个答案,有的人拿「思路清晰、边界严谨」,有的人拿「写完了但不敢说话」。 这一页讲过程,代码模板在 手写题清单。

三个阶段的节奏 ​

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%。 也就是说,代码没一次写对,只要边界和思路清楚,仍然能过。