算法解题流程:从读题到提交的七步

面试时紧张容易脑子空白,把流程固定下来,照着走就行。以下是拿到题目后的标准步骤,适用于链表、数组、树、字符串等各类题目。

详细的边界条件和返回值方法论见 算法解题思路:边界条件与返回值,本文只关注流程。

第一步:读题,提取函数契约(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 分钟)

至少跑三类用例:

  1. 题目示例:题目给的输入输出,必须通过
  2. 边界用例:空输入、单元素、首尾、越界(从第三步的表里来)
  3. 极端用例:全相同、极大输入、退化情况(链表退化成数组、树退化成链表)

不要靠大脑模拟。写下来,跑一遍,用运行结果说话。

第七步:过检查清单(10 秒)

写完提交前,过一遍:

  1. 空输入检查了吗?
  2. 单元素检查了吗?
  3. 首尾边界检查了吗?
  4. 循环终止条件会不会越界?
  5. 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 分钟,够用。

面试紧张的时候,脑子容易跳过步骤直接写代码。把这张速查卡记在脑子里,每做完一步打个勾,就算紧张也不会漏。

相关文章