一位刚结束 Amazon New Grad SDE loop 的同学来做了完整复盘。三轮结构很典型:一轮纯 Coding、一轮纯行为面(Behavioral),还有一轮 Coding + BQ 混合。题目本身都不算难,但整个 loop 下来能明显感觉到一件事——考察的深度在逐轮抬高。他们不只看你能不能做出来,更看你表达是否清晰、思考是否系统、对 Leadership Principles(LP)的理解是否真的内化。下面按轮次拆开讲,附上三道题的完整 Python 代码和一份 LP→STAR 映射表。
面试概况
| 项目 | 详情 |
|---|---|
| 公司 | Amazon |
| 岗位 | SDE(New Grad / 应届) |
| 轮次 | 3 轮:1 纯 Coding + 1 纯 BQ + 1 混合 |
| 单轮时长 | 40–45 分钟 |
| 题目难度 | LeetCode Easy–Medium,高频标准题 |
| 核心考点 | 表达清晰度 + 系统化思考 + LP 内化 + STAR 结构 |
第一轮:纯 Coding(2 题 / 45 分钟)
非常 Amazon 的效率——寒暄两句就直接进 livecode,两道题塞进 45 分钟。
题目 1:验证回文串 II(删一个字符)
给一个字符串,问最多删除一个字符后能否变成回文串。
思路
双指针从两端向中间收缩。字符相等就继续;一旦不相等,就有两种「补救」机会——要么删左指针的字符,要么删右指针的字符。只要其中任意一段是回文,整体就成立。用一个 helper 判断某个区间是否为回文即可。
面试官追问的边界:空串(视为回文)、单字符(回文)。
Python 解法
def valid_palindrome_ii(s: str) -> bool:
"""最多删除一个字符,判断能否构成回文串。"""
def is_palindrome(left: int, right: int) -> bool:
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
i, j = 0, len(s) - 1
while i < j:
if s[i] != s[j]:
# 遇到第一处不匹配:尝试删左边字符 或 删右边字符
return is_palindrome(i + 1, j) or is_palindrome(i, j - 1)
i += 1
j -= 1
return True # 空串 / 单字符 / 本身已是回文
时间复杂度:O(n),最多触发一次 helper 的线性扫描。 空间复杂度:O(1)。
题目 2:插入区间并合并
给一组已按起点排序、互不重叠的区间,再给一个新区间,要求把它插入并合并所有重叠部分,返回新的区间列表。
思路
一趟线性扫描,分三段处理:
- 把所有完全在新区间左侧(
end < new_start)的区间原样加入结果。 - 把所有与新区间重叠的区间和新区间合并:不断用
min更新起点、max更新终点。 - 把剩下完全在右侧的区间原样接上。
面试官追问「为什么不用二分查找定位插入点」——答:这题需要的是把重叠段合并掉,线性一趟扫描逻辑更直观、更稳,二分只能省下定位那一步,收益有限,反而容易在边界上出错。
Python 解法
def insert_interval(intervals, new_interval):
"""在有序不重叠区间中插入 new_interval 并合并重叠部分。"""
result = []
new_start, new_end = new_interval
i, n = 0, len(intervals)
# 1) 完全在新区间左侧的,直接加入
while i < n and intervals[i][1] < new_start:
result.append(intervals[i])
i += 1
# 2) 与新区间重叠的,逐个合并
while i < n and intervals[i][0] <= new_end:
new_start = min(new_start, intervals[i][0])
new_end = max(new_end, intervals[i][1])
i += 1
result.append([new_start, new_end])
# 3) 剩下完全在右侧的,直接接上
while i < n:
result.append(intervals[i])
i += 1
return result
时间复杂度:O(n),一趟扫描。 空间复杂度:O(n),用于存放结果。
第二轮:纯行为面(3 题 / 40 分钟)
这一轮由一位 EM(Engineering Manager)主导,全程 LP 驱动。Amazon 的 BQ 不是走过场,面试官会顺着你的回答一层层往下挖细节,看你讲的是不是真事、当时到底怎么判断的。
问题 1:讲一次你和同事或经理意见不合的经历
对应 LP:Have Backbone; Disagree and Commit。
复盘同学讲的是「因为一个依赖没到位、坚持延后上线」的故事:用数据说明按原计划上线的风险,充分表达了反对意见;但当决策被上级推翻后,他选择 commit,全力配合执行。面试官真正在看的,是你有没有真的听进对方的观点、之后能不能协作推进,而不是一味坚持自己。
问题 2:Ownership
讲一次你主动扛起了职责范围之外的事。复盘同学讲的是一次线上事故:他排查日志、修复了脏数据,还顺手补上了监控告警。面试官追问:「你是先申请许可,还是直接就上手做了?」他的回答是:「我先把问题清楚地同步给了相关的人,确保大家都知情,然后就主动接手了。」——既体现了主人翁意识,也没有变成擅自行动。
问题 3:Failure
讲一次失败。复盘同学讲的是自己高估了负载、导致服务崩溃的经历,重点讲了事后如何做复盘(retrospective)、整理出改进的 action items。Amazon 想看的是你如何直面失败,而不是把一件失败的事包装成「其实也不算失败」。这一点很关键——试图淡化失败,反而会被扣分。
第三轮:混合(2 BQ + 1 Coding)
面试官是一位年轻、语速偏快的工程师。前半段两道 BQ,后半段一道字符串题。
BQ 1:Earn Trust
复盘同学讲的是在一个前端项目里引入类型系统的经历。起初被同事认为是过度设计(overengineering),他通过后续可维护性的提升和交付效率的数据证明了价值。面试官追问:「如果他们还是不认同呢?」——他的回答很成熟:「我会先问清楚,在他们眼里成功长什么样,然后围绕这个结果去对齐,而不是纠结在具体实现方式上。」
BQ 2:Invent and Simplify
讲一次你用创新的方式简化了流程。复盘同学讲的是自己做了一个自动化工具,把 API 文档和代码生成打通。面试官追问:「你怎么衡量它的效果?」——答:对比了手动流程的耗时和工具节省下来的时间,用量化指标说话。
Coding:字符串解码
这一轮的编程题是字符串展开。这里用 LeetCode 394 的经典形式:把 3[a]2[bc] 解码成 aaabcbc,3[a2[c]] 解码成 accaccacc。
思路
用栈来处理嵌套结构。遍历字符串:
- 遇到数字:累计多位数字(可能不止一位)。
- 遇到
[:把「当前已拼好的字符串」和「当前的重复次数」分别压入两个栈,然后重置,进入新一层。 - 遇到
]:从栈里弹出重复次数和上一层的字符串,把当前层字符串重复相应次数后,接到上一层后面。 - 遇到字母:直接追加到当前层字符串。
用两个栈:一个存字符串片段,一个存重复倍数。
面试官很吃「主动写测试用例」这一套,还追问了时间/空间复杂度的权衡。
Python 解法
def decode_string(s: str) -> str:
"""解码形如 3[a]2[bc] 的编码字符串(LeetCode 394)。"""
num_stack = [] # 存重复次数
str_stack = [] # 存进入当前层之前已拼好的字符串
current = "" # 当前层正在构建的字符串
num = 0 # 当前累计的数字(支持多位)
for ch in s:
if ch.isdigit():
num = num * 10 + int(ch) # 处理多位数字,如 12[a]
elif ch == '[':
num_stack.append(num) # 保存重复次数
str_stack.append(current) # 保存上一层已有内容
num = 0
current = ""
elif ch == ']':
repeat = num_stack.pop()
prev = str_stack.pop()
current = prev + current * repeat # 展开当前层并拼回上层
else:
current += ch # 普通字母
return current
时间复杂度:O(N),N 为解码后输出字符串的总长度(每个输出字符构建一次)。 空间复杂度:O(N),栈深度与嵌套层数、输出长度相关。
LP → STAR 映射表
Amazon 的 BQ 本质是「用一个真实故事,证明你身上有某条 LP」。建议每条 LP 至少准备 1–2 个故事,并严格按 STAR 结构组织:Situation(背景)→ Task(任务)→ Action(行动)→ Result(结果,最好带量化指标)。
| 面试问题 | 对应 LP | STAR 关键点 |
|---|---|---|
| 和同事/经理意见不合 | Have Backbone; Disagree and Commit | Situation:依赖未就绪风险;Action:用数据表达反对,被推翻后全力 commit;Result:如期协作落地 |
| 主动扛起分外之事 | Ownership | Situation:线上事故;Action:查日志、修脏数据、补监控,先同步再接手;Result:恢复并预防复发 |
| 一次失败 | Learn and Be Curious / Deliver Results | Situation:高估负载致崩溃;Action:做复盘、列 action items;Result:直面问题并沉淀改进 |
| 说服他人接受你的方案 | Earn Trust | Situation:引入类型系统被质疑过度设计;Action:用可维护性 + 交付效率的数据证明;Result:对齐「结果」而非「实现」 |
| 用创新简化流程 | Invent and Simplify | Situation:文档与代码脱节;Action:做自动化工具打通生成;Result:对比手动 vs 工具耗时,量化收益 |
备考策略
Amazon 的题型这些年变化不大,但细节的深度、推理的完整度、以及对 LP 的内化程度在持续抬高。三点建议:
- BQ 不是讲故事,是结构化思考。 很多人以为行为面就是把经历讲得动听,但 Amazon 想看的是 STAR + 量化指标——用结构去解释你的选择、行为和判断。每条 LP 备 1–2 个故事,先写 bullet,再练口述,最后模拟被追问的场景(「你当时为什么这么判断?」「怎么衡量效果?」)。
- Coding 是标准化高频题。 双指针、区间、栈这类 pattern 反复出现。做出来只是底线,真正加分的是:能讲清逻辑、能主动说改进方向、能报出时间/空间复杂度、能主动写测试用例覆盖边界。
- 主动覆盖边界。 空串、单字符、多位数字、空区间——面试官几乎一定会问。与其等他问,不如你先说出来。
FAQ
Q1:Amazon New Grad SDE 一般几轮?难度如何?
通常是 3–4 轮的 loop(本次是 3 轮),常见结构是纯 Coding、纯 BQ、以及 Coding+BQ 混合。题目多为 LeetCode Easy–Medium 的高频标准题,纯难度并不高,但对表达清晰度和 LP 理解的要求逐轮上升。
Q2:Amazon 的 BQ 到底在考什么?
考的是你身上有没有对应的 Leadership Principles,以及你能不能用结构化的方式把真实经历讲清楚。面试官会顺着回答往下挖细节,判断故事是否真实、你当时的判断依据是什么。用 STAR 组织、带上量化结果,比把故事讲得华丽重要得多。
Q3:讲「失败」的时候,是不是应该挑一个「其实还好」的例子?
不建议。Amazon 明确想看你如何直面真正的失败——如何复盘、如何沉淀改进。把失败包装成「其实不算失败」反而暴露了你不愿正视问题,通常会被扣分。选一个你真的搞砸过、但事后有实质改进的例子。
Q4:Coding 题做出来了,为什么还可能被拒?
因为「做出来」只是底线。面试官同时在评估:思路表达是否清晰、有没有主动分析复杂度、有没有主动写测试用例覆盖边界、面对 follow-up(比如「为什么不用二分」)能不能给出有说服力的权衡。沟通和工程判断力和正确性同等重要。
Q5:区间插入这种题,用二分查找会更好吗?
定位插入点确实可以用二分,但这题的核心是把重叠区间合并掉,仍然要线性扫描一遍重叠段。线性一趟扫描逻辑更直观、边界更稳;二分只省下定位那一步,整体复杂度没变,还更容易写错。面试里能讲清这个权衡,本身就是加分项。
正在准备 Amazon SDE 的面试? 如果你想在 Coding 的表达细节和 BQ 的 STAR 结构上更从容,我们可以帮你做针对性的模拟面试和 LP 故事打磨。
立即添加微信 Coding0201,获取 Amazon 高频题库与 LP/STAR 精修。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy