← 返回博客列表
Amazon

Amazon OA 真题复盘:Bug 优先级排序 + 仓库安全存储

2026-03-15

Amazon OA Question 1

Amazon OA Question 2

题目一:Bug 报告优先级排序

问题描述

你正在帮助 Amazon 的质量保证工程师处理自动化测试日志生成的 Bug 报告。每条日志包含一个整数 Bug 代码,单个测试会话可能包含重复的 Bug 代码。

排序规则

任务:按照上述规则对 Bug 代码进行排序。

示例

输入bugs = [8, 4, 6, 5, 4, 8]

Bug 代码 频率
8 2
4 2
6 1
5 1

排序过程

  1. 频率为 1 的 Bug:6 和 5,按代码号排序 → [5, 6]
  2. 频率为 2 的 Bug:8 和 4,按代码号排序 → [4, 8]
  3. 最终输出[5, 6, 4, 8]

解题思路

方法一:排序 + 哈希表(O(n log n))⭐ 推荐

def sortBugReportFrequencies(bugs):
    from collections import Counter
    
    # 统计每个 Bug 的频率
    freq = Counter(bugs)
    
    # 按照规则排序:先按频率升序,再按代码号升序
    sorted_bugs = sorted(freq.keys(), key=lambda x: (freq[x], x))
    
    return sorted_bugs

时间复杂度:O(n log n)(排序) 空间复杂度:O(n)(哈希表)

方法二:自定义比较器

def sortBugReportFrequencies(bugs):
    from collections import Counter
    from functools import cmp_to_key
    
    freq = Counter(bugs)
    
    def compare(a, b):
        # 先比较频率
        if freq[a] != freq[b]:
            return freq[a] - freq[b]
        # 频率相同,比较代码号
        return a - b
    
    sorted_bugs = sorted(freq.keys(), key=cmp_to_key(compare))
    return sorted_bugs

关键要点

使用哈希表统计频率:O(n) 时间 ✅ 双重排序条件:频率优先,其次代码号 ✅ 利用 Python 的 sorted() 和 key 参数:简洁高效 ✅ 考虑边界情况:单个 Bug、所有 Bug 相同等


题目二:仓库安全存储最大化

问题描述

作为汽车制造公司的物流经理,你需要在 k 个安全仓库中存储配件。

存储规则

安全威胁

任务:找到最大的安全配件数量。

示例

输入

分析

方案一(不优化):

方案二(优化):

  1. 将第二个日志(5)的配件分散:
    • 第一个仓库:3 个(来自日志 1)
    • 第二个仓库:5 个(来自日志 2)
  2. 将第三个日志(9)的配件分散:
    • 第二个仓库:4 个(来自日志 3)
    • 第三个仓库:5 个(来自日志 3)
  3. 将第四个日志(6)的配件分散:
    • 第三个仓库:1 个(来自日志 4)
    • 第四个仓库:5 个(来自日志 4)

结果[3, 5, 5, 5]

等等,让我重新分析...

最优方案

最多的 2 个仓库被入侵,剩余 2 个仓库安全。 安全配件 = 3 + 5 = 8

解题思路

方法:贪心 + 二分查找(O(n log m))⭐ 最优

核心思想

  1. 对配件数量进行排序(降序)
  2. 使用二分查找找到最大的安全配件数量
  3. 对于每个候选答案,检查是否可行
def maximumSecureDeliveries(deliveryLogs, k):
    def canAchieve(target):
        # 检查是否能达到 target 个安全配件
        warehouses = []
        
        for delivery in deliveryLogs:
            remaining = delivery
            
            # 尽量填充现有仓库(不超过 target)
            for i in range(len(warehouses)):
                if warehouses[i] < target:
                    add = min(remaining, target - warehouses[i])
                    warehouses[i] += add
                    remaining -= add
                    if remaining == 0:
                        break
            
            # 如果还有剩余,创建新仓库
            while remaining > 0:
                add = min(remaining, target)
                warehouses.append(add)
                remaining -= add
        
        # 检查是否有足够的安全仓库
        safe_count = sum(1 for w in warehouses if w == target)
        return len(warehouses) <= k and safe_count >= k // 2
    
    # 二分查找最大安全配件数
    left, right = 0, sum(deliveryLogs)
    result = 0
    
    while left <= right:
        mid = (left + right) // 2
        if canAchieve(mid):
            result = mid
            left = mid + 1
        else:
            right = mid - 1
    
    return result * (k // 2)

时间复杂度:O(n log m),其中 m 是配件总数 空间复杂度:O(k)

关键要点

理解问题的本质:最大化安全仓库中的配件 ✅ 贪心策略:尽量平衡仓库中的配件数量 ✅ 二分查找:在可行性和最优性之间找到平衡 ✅ 边界情况:k = 1、所有配件相同等


常见陷阱

题目一

❌ 只按频率排序,忘记处理频率相同的情况 ✅ 使用元组排序:(freq[x], x)

❌ 直接对原数组排序,导致重复计数 ✅ 先统计频率,再对唯一值排序

题目二

❌ 贪心地将所有配件放在一个仓库 ✅ 需要分散配件以最大化安全存储

❌ 没有考虑 k/2 个仓库被入侵的约束 ✅ 确保有足够的安全仓库


面试技巧

  1. 题目一

    • 从简单的排序开始
    • 解释为什么需要双重排序条件
    • 展示如何使用 Python 的排序功能
  2. 题目二

    • 先理解问题的约束条件
    • 从暴力解开始(每个日志单独存储)
    • 逐步优化到贪心 + 二分查找
    • 用具体例子演示算法过程

🚀 需要面试辅助?

oavoservice 提供专业的 Amazon OA/VO 辅助服务。

👉 立即添加微信:Coding0201

获取: