Skip to main content

指南:大厂资深 coding 面试

一本大厂 coding 轮的操作手册——从理解题目到应对追问的一套连贯面试流程,每一步都给出资深做法。

这篇写给谁

一位后端或全栈工程师,正准备在接下来 1–8 周内面试 FAANG 级别公司的中到资深 岗位——Meta E4/E5、Google L4/L5、Amazon SDE II/III,或 Apple、Netflix 以及 大厂邻近梯队里的同等级别。你一直在刷 LeetCode。你没把握的,是到底该怎么把整 场面试跑下来——如何从读一道题走到一份干净、经得起追问、测试过的解法,全程口 述,还在计时下完成。

这就是那本操作手册。它不是又一篇讲怎么解 LeetCode 题的文章——它讲的是如何 在面试当场表现

它在哪个位置:coding 准备体系

三篇文章做三件不同的事。按这个顺序读:

文章它的职责回答
本指南如何在轮次里表现”这 45 分钟我怎么跑?“
问题识别框架如何识别问题”这是哪一类问题?“
精选题目清单什么”练哪约 60 道题?“
资深后端准备计划如何把这一切排序”这 12 周我该做什么?”

它们互补,不重叠。本指南假设你已经能识别模式(那是框架的职责),也有题可练 (清单的职责)。这里,瓶颈是计时压力下的执行

如果你的目标是 E4/L4,这套工作流照用即可;全文标出的那些资深专属动作,对你这 个级别是伸展目标。


自我评估:你卡在哪?

如果这听起来像你……你的问题是该聚焦的工作流步骤
”我能解 medium,但要 35 分钟以上”速度——模式回忆太慢步骤 2(识别)——通过框架去练
”我能解出题目,但挂在追问上”应对——准备了解法,没准备推理步骤 7(应对追问)
“我懂模式,但一上压力就大脑空白”沟通——没法边想边说步骤 1、3、5——每一步都内建了讲解
”我又解出来又讲清楚,还是拿到’不够资深‘“信号——在资深标准上做出了中级动作每一步里的”资深做法"
"我 coding 过了,系统设计却挂了”分配——在 coding 上过度投入资深后端准备计划

核心洞察

一道熟悉的 medium,干净地、口述地、在 20 分钟内解出来。 把这个练成,每一 种 loop 变体都退化成一道包装题;跳过它,再多公司专属的小技巧也救不了这一轮。

这个级别的 coding 轮,评分的形状和大多数候选人以为的不一样。天真的模型是”解出 题目,最好是最优解”——没错,你要是解不出来就拿不下这一轮。但中级和资深之间的 差值,不在题目难度,而在计时压力下的执行质量:干净的代码、清晰的沟通、关 于时间往哪花的校准决策。资深候选人不只是解题——他们在时间压力下做工程决 策,并让那些思考被听见。

这就是为什么本指南是一套工作流,而不是一份技巧清单。只有一套流程;每一道题都 跑同一套;资深是执行这套流程的一种方式,而不是一个独立的话题。

这一轮到底在打分什么

大多数给出了正确解法却仍拿到 no-hire 的候选人,都对结果感到困惑。问题几乎总是 某一个维度停在 0–1,而正确性其实没问题:

信号它的含义中级标准资深标准
正确性能处理输入的可用解法能跑的解法能跑 + 无需提示就覆盖边界情况
速度从读题到可跑代码的用时medium 25 分钟熟悉的 medium 15–20;陌生的 20–25 且思路干净
沟通你如何解释你的思考写代码前说思路权衡——为什么选这个而非其他
代码质量可读性和结构干净、一致的风格生产级:好的命名、小函数、无重复
应对力对追问的反应能接住提示主动推动追问;扩展你自己的解法
测试验证走一遍 happy path说出失败模式;主动测边界情况

下面这套工作流,就是为了把这几行里的每一行从中级列推到资深列而设计的。这是面试 官在一轮出色表现后可能写下的:“很快识别出 sliding-window 模式(1.5 分钟)。选定 前先点了 hash-map 备选。代码干净——命名好,还抽了个窗口校验的 helper。漏了空字符 串的边界情况,但自测时抓到了。干净地处理了’放不进内存’的追问——分块处理的 external sort。Strong hire。” 每一句都对应一个工作流步骤。


各公司的轮次形态

通用的一轮是 45 分钟:开场(5)、coding(约 35)、提问(5)。coding 窗口里发生 什么则因公司而异——而这些差异改变了哪些工作流步骤分量最重:

公司典型形态分量落在哪
Meta~35 分钟内两道题(各约 17 分钟——不管怎样都要切换)步骤 1–6 的速度;吞吐量胜过一道最优解
Google一道题,然后是不断变异它的追问步骤 7——约束改变时你的解法如何适配
Amazon同一小时内一道题 + 一道 LP 问题步骤 5——干净、可扩展的代码(见 logical & maintainable 指南
Apple / Netflix团队而异;通常一道题,务实步骤 5–6——生产直觉、边界情况的用心

有两点值得内化:

  • 前几步的速度是普适的开局。 在 Meta 它就是整个游戏;在 Google 它为追问买 时间;在 Amazon 它为 LP 问题留出余地。一次快速的首解能打开每一扇门。
  • 和 recruiter 确认你这条 loop 的形态。 “每轮几道题、有没有追问、什么环境 (CoderPad、Google Docs)?“是个正常的问题,而答案会改变你的节奏。

面试工作流

每一道题都跑同样的七个步骤,按顺序。这是整轮的脊柱:读到一道题,你从不需要即兴 决定下一步做什么——你在执行一套已知的流程,这让你的注意力得以腾出来给真正的 工作。

而从步骤 3 开始,真正的工作就是工程决策。这是贯穿始终的主线:一场面试是一 连串选择——哪种思路、哪种数据结构、接受哪个权衡、约束变了怎么适配——每一个都带 着理由被大声说出来。沟通不是叠在上面的一项独立技能;它是决策变得可见的方式。 “资深”不是一个独立的章节;它是把那些决策做得更审慎。下面每一步都带一个资深做 法——一句多出来的推理,把这一步抬高一个层次。

flowchart TD
  S1[1 · 理解] --> S2[2 · 识别] --> S3[3 · 评估选项] --> S4[4 · 确定] --> S5[5 · 实现] --> S6[6 · 验证] --> S7[7 · 应对]
  S1 -.资深信号.-> G1[问题选择]
  S2 -.-> G2[模式识别]
  S3 -.-> G3[权衡推理]
  S4 -.-> G4[校准判断]
  S5 -.-> G5[生产级代码]
  S6 -.-> G6[失败模式测试]
  S7 -.-> G7[约束推理]

  classDef step fill:#fdf1e3,stroke:#b45309,stroke-width:2px,color:#1f2937;
  classDef sig fill:#f3ecfb,stroke:#8250df,stroke-width:1px,color:#1f2937;
  class S1,S2,S3,S4,S5,S6,S7 step
  class G1,G2,G3,G4,G5,G6,G7 sig
步骤时间(约 35 分钟中)动作决策
1. 理解60–90 秒复述题目;问那 1–2 个会改变思路的问题我到底在解什么?
2. 识别30–90 秒说出识别类别这是哪一类问题?
3. 评估选项60–90 秒说出可行的思路及其权衡哪些思路摆在台面上?
4. 确定30–60 秒选一个,说为什么,报出复杂度选哪个,代价是什么?
5. 实现剩余时间的约 70%写出来;讲解决策,而非动作我怎么把它写干净?
6. 验证1–2 分钟跑具体输入;点出边界情况它对不对,会在哪里崩?
7. 应对剩下的时间把解法扩展到变化后的约束约束变了会怎样?

步骤 1–4 合计不到 5 分钟。大头留给实现,那才是它该在的地方。有两条规则贯穿所有 步骤:不要跳步(跳过澄清省下 90 秒,等你写到一半发现读错了输入,代价是 6 分 钟),以及不要撑大步骤(4 分钟的澄清是拖延,不是准备)。

步骤 1 —— 理解题目

用你自己的话复述题目,然后问那 1–2 个会改变你思路的问题:输入有序吗?值能为 负吗?预期规模多大?平局怎么打破?这是你首次沟通的地方——在任何代码之前,你和面 试官对”你在解什么”达成一致。

Note

资深做法: 问那些真正重要的问题,并说出它们为什么重要——“如果值可以为 负,sliding window 就行不通,所以在选之前我得知道这一点。“澄清表演(问那些答案 改变不了任何事的问题)读起来很 junior;有针对性的问题读起来像一个在生产里被模 糊需求坑过的人。

步骤 2 —— 识别模式

在选算法之前,先识别这是哪一类问题——识别类别会为随后每一个决策定调。

本指南不教识别——识别框架 才教。 跑它的识别顺序,落到一个类别上,你就得到这一步的产出:“这是一道 Traversal 问题”,或”这是带 sliding window 的 State Maintenance”。如果在一道熟 悉的 medium 上你没法在大约一分钟内做到这点,那是框架和刷题的缺口,不是轮次机制的 缺口——先去那边补上。

Note

资深做法: 大声且迅速地说出类别,然后往下走。在头九十秒里说出”这是一道 top-K 问题——heap 或 quickselect”,会告诉面试官你识别的是结构,而不只是背下来 的题。

步骤 3 —— 评估选项

识别收窄了范围;现在真正的工作开始了——这一轮变成一连串工程决策,而这是第一个。 一旦你知道了类别,通常执行它的方式不止一种。在确定之前说出可行的思路及其权 衡——这是算法推理的得分点,而如果你直接开始写代码,它就不可见。

“两个选项:用 heap 做 O(n log k),适合流式;或者先排序 O(n log n),但更简单、 无需额外结构。”

Note

资深做法: 把你不打算选的那个备选,以及为什么,也摆出来。中级只陈述一个 解法;资深陈述两个并做出选择。面试官没法给他没听到的推理打分。

步骤 4 —— 确定

确定一种思路,把这个选择系到这道题的约束上,并在动手打字前报出复杂度:

“hash map 在这里胜出,因为流式追问需要单次遍历——O(n) 时间,O(n) 空间。”

这里也是放弃最优解这个判断的所在。如果你已经有一个能跑的 O(n log n),看到一 个 O(n) 但只剩 10 分钟,别默默交上更慢的那个,也别盲目重写——把它说出来:“我有 一个能跑的 O(n log n)。我看到用 hash map 的 O(n)——要我重写,还是继续往下走?” 面试官几乎总会说”往下走,把重构思路讲给我听”,然后你干净地回答。和默默交一份次优 解同样的终局,分数好得多。

Note

资深做法: 每个选择都附带一个说出口的代价。“这用了 O(n) 额外空间——原地版 本是存在的,但在计时下更难写对”就是那句把校准过的决策和撞运气的猜测区分开的话。

步骤 5 —— 实现

现在把它写出来。这里有三件事承载分数——如何写出干净面试代码的具体机制在下面的 实现原则里;当下,专注于:

  1. 讲解决策,而非动作。 别说”我现在在写一个 for 循环”——面试官看得见这个循环。 要说*“我用循环而不是递归,因为输入可能很大,递归有 stack overflow 的风险。“*决 策才是信号。
  2. 一次就写干净。 好的命名、小函数、无重复——在计时下就做到,而不是当作事后的 清理。写得可读比重构更省。
  3. 走到哪就处理哪的边界情况, 大声说出来——为空输入加一个提前返回,在你写它的 时候就点名,而不是最后再补上去。

Note

资深做法: 在实现内部讲解权衡——“这里我为了简单用了 list;在生产里我会用 deque 拿 O(1) 的 popleft。“它显示你在用生产代码思考,而不只是通过测试。

Caution

常见错误: 讲解不确定而非决策——“呃,也许 hash map?其实让我退回去用循 环……”先默默想到有一个决策,再讲解那个决策。

步骤 6 —— 验证

走一遍你实际写的代码——逐行——先用一个具体输入,再用一个刻意的边界情况(空输 入、单个元素、重复、边界值)。用真实例子、大声地测试,既是验证也是沟通:面试官看 着你抓到自己的 bug。

Note

资深做法: 别只跑 happy path——说出每个测试会抓到的失败模式。“我要跑空 数组的情况,因为那正是提前返回会缺失的地方。“在面试官问之前就点名他们可能会探的 那些边界情况,是一个强信号。

步骤 7 —— 应对追问

追问不是附录——在 Google、Meta E5 和 Amazon L6,它们就是这一轮的输赢所在。面试官 会变异这道题:“如果放不进内存怎么办?""如果更新是并发到达的怎么办?""如果允许重复 怎么办?“他们往往在评估你能否扩展一个已有解法、在新约束下推理——而不是你有没有产 出第一个解法。 一个搞定了初始解却在变异上僵住的候选人,得分低于一个解得凑合但适 配流畅的候选人。

Important

几乎每个追问都属于以下四类之一:

  • 更大规模——“如果 n 是十亿呢?“(更大的输入)
  • 不同约束——“如果有重复 / 负数 / 顺序重要呢?”
  • 不同 API——“如果这被调用数百万次呢?“(读 vs 写的形态)
  • 在线 / 并发——“如果更新流式进来 / 线程竞争呢?”

认出你被递过来的是四类中的哪一类,适配就随之而来。

大多数候选人在这里僵住,因为他们准备了解法,没准备适配。每一次都跑这套 5 步流程:

  1. 复述新约束。 “所以现在输入放不进内存了——我们需要一个流式或外部的方法。”
  2. 解释为什么旧解法崩了。 “我的 hash map 需要 O(n) 内存,超过 RAM 就行不通。”
  3. 提出新思路。 “我会换成带分块处理的 external sort——把放得下的块排序,再 merge。”
  4. 分析新复杂度。 “O(n log n) 时间,O(chunk-size) 空间;merge 是一个 k-way heap merge。”
  5. 说出它的代价。 “我们失去了随机访问——查询需要重新扫描或加一个 index。”

常见的追问家族及其考察的东西:

追问它测什么应对方向
”放不进内存?“外部/流式思维external sort、map-reduce、流式聚合
”更新在线到达?“摊还 vs 批处理换成在线结构(heap、balanced BST)
“允许重复?“边界情况的健壮性用 Counter 而非 set;去重逻辑
”顺序重要?“稳定性意识stable sort;用 linked list 保留插入顺序
”查询与写入 1000:1?“读优化预计算、cache、index——拿写成本换读
”被调用数百万次?“摊还 / 预计算一次性预处理;之后 O(1) 查找
”多个线程调用它?“线程安全意识lock、CAS、不可变快照、读写分离

Note

资深做法: 在追问被问出之前就主动推动它。解完之后:“这假设它放得进内存—— 如果放不进,我会走 external-sort。要我讲一下吗?“自己去搭建那个变异,是接近 Staff 的信号:面试官变成被动的一方,因为是你在主导这场对话。

当局面走偏:恢复流程

每个候选人真正担心的那个问题——万一我卡住了怎么办? 最常见的失败是一道题吃掉了 12 分钟预算里的 18 分钟:你读错了输入,或追了一个错误的思路。慌张是自然的,也是 错的。

  1. 在心里重置时钟。 剩下多少,只要不浪费,都够解一道 medium。
  2. 压缩步骤 1–2。 30 秒理解,说出模式,往下走。
  3. 从暴力解法开始。 说出来——“我先从这里开始,有时间再优化”——然后写。一个 能跑的暴力解法,永远胜过一个进行到一半的最优解。
  4. 口头拿下优化。 “这是 O(n²);O(n log n) 用一个 heap,我接下来会写它。”

如果什么都想不出来,就把暴力解法大声说出来并写它——一旦嵌套循环让冗余的工作变得 可见,模式通常就自己浮现了。一个能跑、并引向口头优化的暴力解法,永远胜过僵住的沉 默。

实例演练:Merge Intervals

56. Merge Intervals 上跑这七 步,每步一行——一次约 12 分钟的解:

  1. 理解: merge 重叠的 [start, end] 区间——有序吗?start 能等于 end 吗?(未 排序;能。)
  2. 识别: 一道 Ordering 问题——正确性依赖于有序。
  3. 评估: sort + 线性扫描,或一棵 interval tree(对一次性 merge 是杀鸡用牛刀)。
  4. 确定: 按 start 排序,扫描,重叠时扩展当前区间——O(n log n) 时间,O(n) 输出。
  5. 实现: 在你跟踪当前已合并区间时,讲解这次扫描。
  6. 验证:[[1,3],[2,6],[8,10]],再跑相接的边界情况 [[1,4],[4,5]] → [1,5]
  7. 应对: 如果区间是流式进来、放不进内存 → 按 start 做 external-sort,同样的扫描。

诊断与训练

失败诊断

一致的 mock 反馈会映射到一个具体的工作流步骤:

症状根因修法(按步骤)
时间总是不够用识别太慢(步骤 2)框架直到类别识别 <1 分钟
澄清完就卡住写代码前例子太弱(步骤 1→3)在动思路前强制两个例子——一个简单、一个边界
实现有 bug模板不熟(步骤 5)每天从零重写经典模式,直到干净
挂在追问上解法太脆(步骤 7)在每道 medium 上跑那套 5 步阶梯;自己发明”如果……”
解出来了却没 hire沟通缺口(步骤 3、5)录下自己;讲解每一个决策直到自然
代码能跑但乱干净代码没练(步骤 5)练到 Amazon 的标准:好命名、小函数

就绪清单

具体的关卡——不是”我感觉准备好了吗?“而是”我能不能可证明地做到?”

  • 在 ≤20 分钟内用干净代码 + 完整讲解解出一道熟悉的 medium
  • 在 ≤25 分钟内解出一道陌生的 medium(3 分钟思路,15 分钟代码,5 分钟测试)
  • 在 <1 分钟内说出一道随机 medium 的识别类别
  • 凭记忆在各 <5 分钟内写出 sliding-window / BFS / heap-top-k 模板
  • 从一张白纸在 ≤25 分钟内实现 LRU Cache
  • 用那套 5 步阶梯,在 <5 分钟内端到端处理一个追问变异
  • 在 ≤2 分钟内陈述任意 medium 的思路,并让一个 mock 搭档认同它清晰
  • 一口气解释一个正确的 O(n log n) 说出 O(n) 备选

勾选 7 项以上:接近就绪。少于 5 项:先补缺口,再约面试。

5 分钟复盘

每次 mock 之后、看题解之前:

  1. 哪个工作流步骤花的时间最长? 那是你的瓶颈——去练它。
  2. 哪一行信号得分最低?(正确性、速度、沟通、代码质量、应对力、测试。)那是你 下一个聚焦点。
  3. 你会换成怎么说? 写下那句能让它”明显资深”的话,下一遍就大声说出来。

AI 时代的 coding 面试

截至 2026 年年中,AI 正越来越多地削弱纯实现速度的价值——那些它做得好的步骤 5 机 制(语法、样板、标准模式)。工作流不变;分量转移到推理步骤上——理解(1)、决策 (3–4)和适配(7)——这些是 AI 在一场实时对话里没法替你做的。如果你的 loop 包含一 个显式的 AI 辅助轮,读指南:AI 原生 coding 面试


实现原则

步骤 5 的参考——如何让你在 30 分钟里写的代码,读起来像你凭本能就在写生产代码。在 准备阶段把这些练到自动化,这样在轮次里它们是本能,而不是你盯着时钟时还要想的东西。

  • 好的命名。 leftrightcount 胜过 lrc——命名是面试官不用问就 能读懂你代码的方式。
  • 小的 helper 函数。 把重复逻辑抽成一个命名过的 3 行 helper;它显示分解的本能。
  • 单一职责,无重复逻辑。 两个一模一样的块是一次错过的抽取,而面试官会注意到。
  • 防御性的边界情况, 在你写它们时就点名——为空输入加提前返回、边界检查。

关于语言:对大多数候选人,Python 是对的选择——每个算法更少的击键,而 Counter / heapq / deque / defaultdict 直接落在常见模式上。例外是系统/基础 设施岗位,那里团队的 C++/Go 信号更契合。无论你选什么,都把它当生产代码来写——在 Amazon 那是明写的评分标准,在别处它是一个无声的加分项。


接下来做什么

准备就是:刷识别(框架)→ 练题目(清单)→ 在这套工作流上跑完整的计时轮次。

  • 4 周以上: 按识别顺序、拿着秒表跑题目清单;从第 3 周起,每周两场按你目标公司形态的完整计时 mock,跑全部七步。
  • 2 周: 放弃 hard;在 easy/medium 上练步骤 1–6 的速度;每题两个追问变异(步骤 7);每周两场 mock。
  • 1 周: 不学新模式——在你会的题上热身识别;每周两场独自的、全速的 mock,跑完 整个工作流。
  • 24 小时: 一道 easy、一道 medium,带讲解跑完整工作流,然后停下。

相关