手撕:两数之和。

算法工程师第 2 / 15 题答题框架
参考思路:暴力 O(n²)→哈希表 O(n) 一趟扫描(存 value→index)→追问有序数组双指针变体。先确认输入约束(重复/无解)。

五个经典回答示范

回答一 · 思路口述版

「先和面试官确认:数组无序、是否可能有重复元素、要求返回下标还是值、保证有解吗。我的方案是哈希表一趟扫描:遍历时查 target-当前值 是否在表里,在则返回,否则把当前值和下标存入。时间 O(n) 空间 O(n)。」先确认输入约束再选方案,是算法面的基本素养。

回答二 · 标准写法

function twoSum(nums, target) { const map = new Map(); for (let i = 0; i < nums.length; i++) { const need = target - nums[i]; if (map.has(need)) return [map.get(need), i]; map.set(nums[i], i); } return []; } 关键细节:先查再存——同一元素不会用两次,也能正确处理 [3,3] target 6 的用例。

回答三 · 进阶变体

变体一:有序数组两数之和——双指针首尾收缩,O(n) 时间 O(1) 空间。变体二:返回所有不重复组合——排序加双指针,去重在移动指针时跳过相同值。变体三:三数之和——固定一个数退化为两数之和,整体 O(n²),同样要处理去重。面试官常顺着两数之和一路追问到三数,提前准备。

回答四 · 边界与测试

用例:负数与零、target 为负、数组含重复值且重复值构成解、无解返回什么(约定空数组或 null)、大数溢出(某些语言两数相加溢出要先转 long)。哈希方案对无解输入返回约定值即可;双指针方案前提是有序,别忘说排序成本。

回答五 · 常见错误

错误一:双重循环写出来后说「这就是最优了」——没有哈希表的意识直接暴露准备不足。错误二:先存后查——遍历到自身时可能把自己当成配对。错误三:哈希方案下标返回顺序不对(题目要求小在前)。点评:这题定位是送分,答不好后面手撕难度全降级。

怎么练这道题
  1. 打开 模拟练习,选择「算法工程师」方向,限时 3 分钟作答本题。
  2. 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
  3. 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。

这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。

开始限时演练