算法解题流程:从读题到提交的七步
面试时紧张容易脑子空白,把流程固定下来,照着走就行。以下是拿到题目后的标准步骤,适用于链表、数组、树、字符串等各类题目。
详细的边界条件和返回值方法论见 算法解题思路:边界条件与返回值,本文只关注流程。
第一步:读题,提取函数契约(2 分钟)
不要急着写代码。先读两遍题,用注释写下三行:
// 输入:____(什么数据结构?什么类型?是否有序?可能为空?)
// 输出:____(返回索引?值?新结构?长度?布尔?)
// 约束:____(时间复杂度要求?空间复杂度要求?是否原地修改?)
如果题目说”返回新数组的头”,那就是返回 head,不是返回你操作的中间变量。如果题目说”返回索引”,那就是返回 int,不是返回元素值。
这一步的目的是让大脑从”我要解题”切换到”我要写一个契约明确的函数”。
第二步:手动模拟,理解题意(3 分钟)
拿题目给的示例,在纸上或脑子里走一遍。不要写代码,先确认你理解了题目在问什么。
- 输入 → 期望输出 → 为什么是这个输出?
- 如果输入变了(空数组、单元素、全相同),输出应该是什么?
这一步同时帮你理解了正常路径和边界场景。
第三步:列边界表(2 分钟)
画一张表,列出所有边界场景和对应返回值:
| 场景 | 返回什么 |
|---|---|
| 空输入 | ? |
| 单元素 | ? |
| 首部/尾部 | ? |
| 越界/无效 | ? |
| 正常场景 | ? |
不用想算法,只想”每种情况应该返回什么”。这张表写完,你的 if-else 分支和 return 语句就定好了。
第四步:想算法,选模式(5 分钟)
根据数据结构和问题特征,选择算法模式:
| 如果题目涉及 | 可能的模式 |
|---|---|
| 有序数组/查找 | 二分查找 |
| 链表找位置 | 快慢指针 |
| 区间/子串/窗口 | 滑动窗口 |
| 组合/排列/子集 | 回溯 |
| 最优解/分步选择 | 贪心 |
| 重叠子问题 | 动态规划 |
| 层级遍历 | BFS |
| 路径/深度 | DFS |
想不出模式?先写暴力解法,保证正确,再优化。面试时暴力解法 + 说出优化方向,比空白强十倍。
第五步:写代码,先骨架后填充(5-8 分钟)
先写函数签名和分支骨架,不填具体逻辑:
function solve(input): Output {
// 边界处理(从第三步的表里抄)
if (空输入) return ?
if (单元素) return ?
if (越界) return ?
// 正常逻辑(从第四步的模式来)
// TODO: 填充
// 返回(从第一步的契约来)
return ?
}骨架写完,每个 return 已经确定了。再填充正常逻辑时,不会跑偏到错误的返回值。
第六步:跑测试验证(2 分钟)
至少跑三类用例:
- 题目示例:题目给的输入输出,必须通过
- 边界用例:空输入、单元素、首尾、越界(从第三步的表里来)
- 极端用例:全相同、极大输入、退化情况(链表退化成数组、树退化成链表)
不要靠大脑模拟。写下来,跑一遍,用运行结果说话。
第七步:过检查清单(10 秒)
写完提交前,过一遍:
- 空输入检查了吗?
- 单元素检查了吗?
- 首尾边界检查了吗?
- 循环终止条件会不会越界?
- return 的东西是调用方需要的,不是你正在操作的?
流程速查卡
| 步骤 | 时间 | 做什么 |
|---|---|---|
| 1. 函数契约 | 2 min | 写”输入/输出/约束”三行注释 |
| 2. 手动模拟 | 3 min | 用示例走一遍,确认理解题意 |
| 3. 边界表 | 2 min | 列出所有边界场景和返回值 |
| 4. 选模式 | 5 min | 根据特征选算法模式,想不出先暴力 |
| 5. 写骨架 | 5-8 min | 先写分支骨架和 return,再填充逻辑 |
| 6. 跑测试 | 2 min | 示例 + 边界 + 极端 |
| 7. 检查清单 | 10 sec | 空? 单元素? 首尾? 越界? 返回值? |
总时间约 20-25 分钟,面试一般给 30-45 分钟,够用。
面试紧张的时候,脑子容易跳过步骤直接写代码。把这张速查卡记在脑子里,每做完一步打个勾,就算紧张也不会漏。
相关文章
- 算法解题思路:边界条件与返回值 — 边界条件和返回值的详细方法论
- 贪心算法 — 贪心模式详解
- 链表解题 — 链表题型的方法论
- 快慢指针 — 快慢指针模式详解