近期 Amazon 再次开启大规模 Online Assessment 发放,本轮 OA 统一使用 HackerRank 平台。不少同学在做完之后的共同感受是:题目本身并不偏难,但一旦理解偏差,后续代码几乎无法挽回。今天来对 Amazon OA 的两道 Coding 题进行系统性复盘,帮助后续参加 OA 的同学提前建立正确预期。
Amazon OA 基本信息概览
- 测试平台:HackerRank
- 题目数量:2 道 Coding
- 整体难度:中等偏上
- 主要考察能力:
- 复杂业务规则的快速抽象
- 动态数据结构的使用能力
- 贪心策略是否合理
- 对隐藏约束和边界条件的敏感度
第一题:服务器分配与 Cost 计算问题
题目背景
系统中存在若干台服务器,每台服务器拥有一定数量的空闲实例。服务器状态以数组形式给出,数组下标代表服务器编号,数值代表当前可用实例数量。
现在有 m 位客户依次到来,每一位客户都需要选择一台服务器租用一个实例。服务器的状态会随着客户的选择不断发生变化。
分配与 Cost 规则
对每一位客户,系统会执行如下操作:
- 在当前所有服务器中,选择 空闲实例数量最多 的服务器
- 成功选择后,该服务器的空闲实例数量减 1
- 本次选择会产生一个 cost,其计算方式为:
- cost = 选择前,当前所有服务器中的最小空闲实例数 + 最大空闲实例数
最终要求输出:在 m 位客户完成分配之后,所有 cost 的累计总和。
解题本质分析
这是一道非常典型的 Amazon 风格题目,本质并不是考察复杂算法,而是考察候选人是否能够:
- 快速识别这是一个 动态维护最大值和最小值的问题
- 在多次更新场景下,避免使用低效的全数组扫描
在 ProgramHelp 的辅导过程中,这道题的主要失分原因集中在三个方面:
- 没有意识到 cost 必须在「选择之前」计算
- 每一轮通过遍历数组寻找最大/最小值,导致时间复杂度过高
- 没有正确处理实例数量减到 0 后的服务器状态
正确解题方向
这类问题的标准解法是使用堆结构 来维护服务器状态:
- 使用最大堆动态维护当前空闲实例最多的服务器
- 同时维护当前最小空闲实例值(可通过最小堆或额外计数结构)
每一轮操作只需要:
- 取最大值
- 记录当前最大与最小
- 更新服务器状态并重新入堆
只要数据结构选择正确,整体实现是稳定且可控的。
第二题:Log 零件与 Warehouses 分配最大化问题
题目背景
系统中存在多个 log delivery,每个 log 对应一定数量的零件(parts)。现在有 k 个 warehouses,其中 k 为偶数。
存储规则如下:
- 每个 warehouse 只能存储来自 同一个 log 的零件
- 同一个 log 的零件可以被分散存储到多个 warehouse
- 允许存在部分 log 的零件最终未被任何 warehouse 存储
排序与目标约束
当所有 warehouse 完成存储后:
- 按照每个 warehouse 存储的零件数量进行排序
- 排名前
k/2的 warehouse 被认为是“存储最多的一半” - 排名后
k/2的 warehouse 被认为是“存储最少的一半”
题目要求输出:
后半部分(存储最少的 k/2 个 warehouse)中,零件数量之和的最大可能值。
解题核心难点
这道题的难点并不在于实现,而在于对目标的理解。
很多同学会下意识地想要“尽量多存零件”,但真正的优化目标并不是总存储量,而是:
在排序之后,尽可能抬高后半部分 warehouse 的总和。
这意味着:不能让前半部分 warehouse 吃掉过多零件,分配策略必须尽量均衡,同时满足单 warehouse 只能来自同一 log 的限制。
为什么很多考生在应对 Amazon OA 会选择专业助攻?
在 ProgramHelp 的真实案例中,很多同学的问题并不是“完全不会写”,而是:OA 时间不足,来不及试错,题目规则复杂,容易在细节处踩坑,平台限制严格,一次失误直接淘汰。
Amazon OA 的本质是筛人而不是教学。在这种情况下,选择稳定、经验成熟的面试支持,往往比单纯“再刷几道题”更有效。