一、Amazon OA 整体体验
从整体体验来看,今年的 Amazon OA 延续了 Amazon 一贯的出题风格:题目是“新壳”,但底层模型并不陌生。更看重的是你能不能快速把问题抽象成标准解法,而不是会不会某一道偏门技巧。
Amazon OA 一共两道题,我大概30分钟左右全部 AC。趁着记忆还清晰,简单整理了一下题目和思路(具体内容见下文),给后面准备 Amazon OA 的同学做个参考。
我手边也有一份 OA 题库,包含题型分类和答题思路,可做系统练习。

1️⃣ Amazon OA 一般多久出结果?没消息是不是就挂了?
这个问题几乎是每一轮都会被问到。实际体验是,Amazon 的 OA 结果推进节奏非常依赖批次headcount,有的候选人几天内就能收到下一步,有的则会间隔一到两周。如果你 OA 是全 AC,但短时间内没有任何动静,更多时候是流程优先级或者 HC 调整的问题,并不一定代表已经被淘汰。一个比较明显的信号是,真正被系统或 recruiter 标记为继续推进的候选人,流程通常不会被无限期搁置。
2️⃣ OA 一定要全 AC 才有后续吗?
说结论会比较现实一些。对于 Amazon 来说,尤其是 New Grad 或 Early Career 批次,全 AC 的通过概率明显更高。并不是说少过一两个 hidden case 就一定没机会,但从大量面经反馈来看,全 AC 基本相当于进入 Tech Screen 或 VO 的“入场券”。OA 在 Amazon 的筛选权重确实非常高。
3️⃣ 题目做出来了,但代码不够优雅,会有影响吗?
在 OA 阶段,Amazon 更关注的是代码是否稳定、是否正确,以及是否覆盖了边界情况。只要时间复杂度在合理范围内,不存在明显 bug,逻辑自洽,基本不会因为你没有写出最优雅或最短的代码而被卡。OA 更像是在验证你能不能在有限时间和压力下写出可用、可维护的代码,而不是炫技。
4️⃣ Amazon OA 常见题型应该怎么准备?
从最近几轮 OA 的题型来看,出现频率最高的还是滑动窗口、双指针、BFS 或 DFS、基于 HashMap 的建模,以及一些状态不复杂但需要抽象能力的 DP。相比无目的地刷题,更重要的是训练自己在读完题目的一两分钟内,能不能快速把问题归类到一个熟悉的模型中,这一点往往比题量更关键。
5️⃣ OA 最容易翻车的地方在哪里?
最常见的情况并不是算法不会,而是题意没有完全吃透就开始写,或者在复杂度和边界条件上掉链子。比如没有考虑空输入、极小规模的数据,或者在滑动窗口和 BFS 中不小心写出隐性超时。Amazon 的 OA 并不介意你多花一点时间想清楚,但非常容易因为“写得快但不稳”而直接被筛掉。
二、Amazon OA 真题
Q1
题目:一个初始为 p1×q1 的网格(所有格子为空),通过若干次操作将其扩展为 p2×q2 的网格。每次操作:选择”vertical”(在顶部加一行)或”horizontal”(在右侧加一列),然后在新增的格子中恰好占用其中一个,其余保持为空。最终网格为 p2×q2,底部左下角的原始格子始终为空。最终p2×q2网格中所有格子的填充状态共有多少种可能的配置?结果对 998244353 取模。
思路:
- 先把问题转成“新增了多少行 r 和多少列 c”,然后用动态规划按“逐行扩展”来统计方案数。
dp[new_c]表示处理到当前阶段时,已经新增了new_c列的所有合法填法数量。- 每次新增一行时,有两类转移:要么在当前已有列里选位置放(乘当前列数),要么结合之前的状态和前缀累积
s处理“新增列带来的贡献”。 - 最后再把剩余列扩展的影响一次性乘上(用幂数组
p),把所有new_c的结果加起来并取模。
代码:
def findAllocationWays(p1, q1, p2, q2):
MOD = 998244353
r = p2 - p1
c = q2 - q1
dp = [0] * (c + 1)
dp[0] = 1
for new_r in range(r):
base = (p1 + new_r) % MOD
nxt = [0] * (c + 1)
s = 0
for new_c in range(c + 1):
nxt[new_c] = (nxt[new_c] + dp[new_c] * ((q1 + new_c) % MOD)) % MOD
if new_c >= 1:
s = (base * (s + dp[new_c - 1])) % MOD
nxt[new_c] = (nxt[new_c] + s) % MOD
dp = nxt
b = (p1 + r) % MOD
p = [1] * (c + 1)
for i in range(1, c + 1):
p[i] = (p[i - 1] * b) % MOD
ans = 0
for new_c in range(c + 1):
ans = (ans + dp[new_c] * p[c - new_c]) % MOD
return ansQ2
题目:有 n 个机器人,每个机器人 i 有一个阈值 coordinationThreshold[i],表示它正常工作所需的其他处于 Operating 状态的机器人数量。若机器人 i 处于 Operating 状态,但其他 Operating 机器人数量小于 threshold[i],则故障。若机器人 i 处于 Standby 状态,但 Operating 机器人总数大于等于 threshold[i],则故障。有多少种合法的 Operating/Standby 分配方案(任何机器人都不故障)?
思路:
- 假设最终有 k 个机器人是 Operating,那么所有阈值
<= k-1的机器人必须都能进 Operating,否则凑不够 k 个。 - 如果某个机器人的阈值刚好是
k,它无论选 Operating 还是 Standby 都会出错,所以这种 k 必须排除。 - 所以我们统计每个阈值出现次数
freq,并用前缀和算出cnt = 阈值 <= k-1 的机器人数量。 - 当且仅当
cnt == k且freq[k] == 0,这个 k 是一个合法配置,答案加 1。
代码:
def getValidConfigurations(coordinationThreshold):
n = len(coordinationThreshold)
freq = [0] * (n + 1)
for t in coordinationThreshold:
freq[t] += 1
ans = 0
cnt = 0
for k in range(n + 1):
if k > 0:
cnt += freq[k - 1]
if cnt == k and freq[k] == 0:
ans += 1
return ans三、Amazon OA 做题总结
Amazon oa 做题速度很重要 大部分Coding的面试题都不会特别的难,哪怕是遇到了Hard难度的题,只要尽量多的输出自己的思路也能让面试官觉得你不错。
OA以能做出来为主,如果能用一句code写出来,就不要写两句。不要为了showoff,而因小失大;及时反馈思路,拿一个20min的一题举例子,一般2min读题,3min讲思路,10分种coding,5分钟和面试官过代码,debug。但当你发现,你花了五分钟还没想出最优思路的时候,如果你继续思考哪怕你想出来了,也有可能没时间完成后面写码和测试的环节了,所以此时要快速的把已有的解法先写出来。
如果你也在准备 Amazon 或其他大厂的 OA/VO,可以直接联系 interviewAid 了解对应的面试辅助和陪跑支持。如果你想找我辅助面试,或者用 Amazon 面经 中的原题 mock,感受最真实的feedback,欢迎戳我。