1. 课程导入与面试全景

欢迎进入《算法面试实战题库》。在开始刷第一道题之前,我们需要先建立一张“面试地图”。很多候选人花了大量时间刷题,却在真实面试中表现不佳,根本原因往往不是算法能力不足,而是对面试的考察维度、轮次结构、评分逻辑缺乏清晰认知。本章的目标,是让你在动手写代码之前,先理解这场“考试”到底在考什么、怎么考、以及你应该如何准备。

一、算法面试到底在考察什么

算法面试并非单纯考察“能否写出正确答案”。面试官在有限时间内,通常同时评估以下几个维度:

  • 问题理解与澄清能力:面对模糊描述,能否主动提问、确认边界条件、明确输入输出。例如题目说“找出数组中的重复元素”,你需要确认:数组是否已排序?是否只有一个重复元素?是否允许修改原数组?这些澄清直接影响解法选择。
  • 解题思路与算法设计:能否从暴力解法出发,逐步优化到更优时间复杂度或空间复杂度。面试官更看重你如何从 O(n²) 想到 O(n log n) 或 O(n),而不是一上来就背出最优解。
  • 代码实现能力:在无 IDE 提示的环境下,能否写出结构清晰、边界正确的代码。变量命名、循环边界、空输入处理都是观察点。
  • 复杂度分析:写完代码后,能否准确说出时间与空间复杂度,并解释为什么。
  • 沟通与协作:遇到卡壳时能否表达当前思路、接受提示并调整方向。面试是协作过程,不是闭卷考试。

这五个维度中,后三项往往被低估。实际评分中,一个思路正确但代码边界出错、且无法解释复杂度的候选人,通常不如一个思路稍慢但沟通清晰、代码稳健的候选人。

二、常见面试轮次与节奏

典型的技术面试通常包含以下轮次,不同公司名称不同,但结构相似:

轮次 时长 核心内容 观察重点
电话/在线初筛 30–45 分钟 1 道中等难度算法题 基本编码能力、沟通是否清晰
技术一面 45–60 分钟 1–2 道算法题 + 基础知识 解题思路、复杂度分析、代码质量
技术二面 60 分钟 1 道较难题 + 追问优化 深度思考、能否接受提示并推进
系统设计/交叉面 60 分钟 设计题或行为问题 工程思维、协作与权衡

注意:算法题通常只占 1–2 道,但每道题会被拆成“澄清—思路—编码—测试—复杂度”多个阶段。面试官在每个阶段都有观察点,因此节奏控制非常重要。建议的时间分配是:澄清与思路 5–10 分钟,编码 15–20 分钟,测试与复杂度 5 分钟。如果 20 分钟还没开始写代码,通常会被打断。

三、评分逻辑:面试官在打分表上写什么

多数公司使用结构化评分表,常见档位为“强烈推荐 / 推荐 / 中立 / 不推荐”。评分依据通常包括:

  • Problem Solving:能否独立找到可行解,并在提示下优化。
  • Coding:代码是否正确、简洁、可读,边界是否处理。
  • Communication:是否主动表达思路,是否理解提示。
  • Complexity:能否准确分析并解释权衡。

一个常见的误区是“只要题做出来就能过”。实际上,如果候选人沉默 10 分钟然后直接写出答案,沟通项会失分;如果代码有 off-by-one 错误且未自测发现,编码项会失分。因此,面试中的“过程”与“结果”同等重要。

四、题库使用方式与 30 节学习路径

本课程共 30 节,按“基础数据结构 → 核心算法思想 → 高频题型 → 综合实战”递进。每节围绕一个主题,包含:典型题目、解题模板、复杂度分析、常见陷阱与变体。建议的使用方式是:

  1. 先读题,自己思考 10 分钟,写下思路和复杂度,再对照讲解。
  2. 手写代码,不要依赖 IDE 自动补全,模拟面试环境。
  3. 自测边界:空输入、单元素、重复元素、极值。
  4. 记录错题:标注是思路错、边界错还是复杂度分析错。

30 节的学习路径大致如下:第 1–5 节建立面试认知与数组、字符串基础;第 6–12 节覆盖链表、栈、队列、哈希表;第 13–20 节深入递归、分治、排序、二分、双指针、滑动窗口;第 21–26 节攻克树、图、动态规划;第 27–30 节进行综合模拟与高频题复盘。每节建议投入 2–3 小时,其中至少一半时间用于独立编码和自测。

五、一个可执行的开局练习

为了让你立刻进入状态,这里给出一个“面试开场”的模拟示例。题目:给定一个整数数组 nums 和一个目标值 target,返回数组中两个数的下标,使它们之和等于 target。假设每个输入只有一个答案,且同一元素不能重复使用。

面试中的正确开场不是直接写代码,而是先澄清:

候选人:数组是否已排序?是否可能包含负数?
面试官:未排序,可能包含负数。
候选人:是否保证一定有解?返回任意一组还是全部?
面试官:保证有解,返回任意一组即可。
候选人:好的,我先说暴力解法:双重循环,时间复杂度 O(n²),空间 O(1)。
        优化思路是用哈希表记录已访问元素的值和下标,遍历时检查 target - nums[i]
        是否在表中,这样时间 O(n),空间 O(n)。我可以开始写吗?

这段对话展示了澄清、暴力解、优化思路和复杂度分析,正是面试官希望看到的节奏。随后编码时,注意哈希表在检查之后再插入当前元素,避免同一元素被使用两次。写完后用示例 nums = [2, 7, 11, 15], target = 9 手动走一遍:i=0 时表为空,插入 2→0;i=1 时检查 9-7=2 在表中,返回 [0,1]。最后说明时间 O(n)、空间 O(n)。

这个例子虽简单,却完整覆盖了面试的五个维度。在后续 29 节中,我们会不断重复并强化这套流程,直到它成为你的本能反应。现在,请带着这张“面试地图”,开始你的第一道练习。