Amazon SDE Intern OA 2026 春招最新出现的 "Sum of Skills" 题在一亩三分地的命中率约 16%,属于中高频题。表面上是一道数组求和题,实际考察前缀和优化 + 边界条件处理的细节。本文给出三种解法路径、Python 完整实现以及 OA 评分系统的隐藏要求。
题目描述
Amazon 招聘部门需要为一个项目组建团队。给定一个长度为 n 的整数数组 skills,表示每个候选员工的技能值。组建方式如下:
- 团队是数组中连续的 k 个员工(子数组)
- 团队的总技能值定义为子数组元素之和
- 需要返回所有长度恰好为 k 的连续子数组的技能值之和的列表,按照子数组起始位置升序排列
输入约束
1 ≤ n ≤ 10^51 ≤ k ≤ n-10^4 ≤ skills[i] ≤ 10^4
示例
输入: skills = [3, -1, 4, 1, 5, 9, 2, 6], k = 3
输出: [6, 4, 10, 15, 16, 17]
解释:
- [3, -1, 4] = 6
- [-1, 4, 1] = 4
- [4, 1, 5] = 10
- [1, 5, 9] = 15
- [5, 9, 2] = 16
- [9, 2, 6] = 17
三种解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 实战推荐度 |
|---|---|---|---|
| 暴力求和 | O(n × k) | O(1) | ⭐ |
| 前缀和 | O(n) | O(n) | ⭐⭐⭐⭐ |
| 滑动窗口 | O(n) | O(1) | ⭐⭐⭐⭐⭐ |
解法一:暴力(基线)
def team_skills_brute(skills, k):
n = len(skills)
result = []
for start in range(n - k + 1):
window_sum = sum(skills[start:start + k])
result.append(window_sum)
return result
时间复杂度:O(n × k),当 n=10^5 且 k=10^4 时会超时。
解法二:前缀和(推荐用于变体题)
预计算前缀和数组 prefix,则任意子数组 [i, j) 的和等于 prefix[j] - prefix[i]。
def team_skills_prefix(skills, k):
n = len(skills)
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + skills[i]
result = []
for start in range(n - k + 1):
result.append(prefix[start + k] - prefix[start])
return result
时间复杂度:O(n);空间复杂度:O(n)。
前缀和的好处:如果题目变体要求任意区间长度的查询(不固定 k),前缀和是 O(1) 查询的唯一办法。
解法三:滑动窗口(OA 评分系统首选)
固定窗口大小 k,每次右移:减去最左边的元素,加上最右边的新元素。
def team_skills(skills, k):
n = len(skills)
if k > n:
return []
window_sum = sum(skills[:k])
result = [window_sum]
for i in range(k, n):
window_sum += skills[i] - skills[i - k]
result.append(window_sum)
return result
时间复杂度:O(n);空间复杂度:O(1)(不计输出)。
为什么 OA 系统首选滑动窗口
Amazon 的 OA 评分系统会在隐藏测试用例中:
- 用大数据(n = 10^5)测速度 → 排除暴力解法
- 用极端值(连续 10^4 的最大值)测数据溢出——Python 自动大整数,C++/Java 需要用 long long
- 用 k = n(整个数组)测单结果输出
- 用 k = 1(每个元素自成一组)测最小窗口
滑动窗口在所有用例下都最稳。
完整解题框架
def get_skill_sums(skills, k):
n = len(skills)
if n == 0 or k == 0 or k > n:
return []
window_sum = sum(skills[:k])
result = [window_sum]
for i in range(k, n):
window_sum += skills[i] - skills[i - k]
result.append(window_sum)
return result
def test():
assert get_skill_sums([3, -1, 4, 1, 5, 9, 2, 6], 3) == [6, 4, 10, 15, 16, 17]
assert get_skill_sums([1, 2, 3], 3) == [6]
assert get_skill_sums([5], 1) == [5]
assert get_skill_sums([], 1) == []
assert get_skill_sums([1, 2, 3], 5) == []
assert get_skill_sums([-1, -2, -3, -4], 2) == [-3, -5, -7]
print("All tests passed.")
test()
题目变体(OA 高频出现)
变体一:返回最大团队技能值
def max_team_skill(skills, k):
sums = get_skill_sums(skills, k)
return max(sums) if sums else 0
变体二:返回最大技能值的起始索引
def max_team_start_index(skills, k):
n = len(skills)
if k > n:
return -1
window_sum = sum(skills[:k])
best_sum = window_sum
best_start = 0
for i in range(k, n):
window_sum += skills[i] - skills[i - k]
if window_sum > best_sum:
best_sum = window_sum
best_start = i - k + 1
return best_start
变体三:技能值之和 ≥ target 的团队数量
def count_teams_above_target(skills, k, target):
n = len(skills)
if k > n:
return 0
window_sum = sum(skills[:k])
count = 1 if window_sum >= target else 0
for i in range(k, n):
window_sum += skills[i] - skills[i - k]
if window_sum >= target:
count += 1
return count
OA 答题策略
- 第一遍写滑动窗口,节省时间留给第二题
- 变量命名要业务化:
team_size比k更受 OA 评分系统好评 - 加边界测试用例:Amazon OA 的隐藏测试覆盖很多边角,主动写 4-5 个 assert
- 不要在 OA 中写注释解释算法,节省时间——评分系统不看注释
FAQ
Sum of Skills 在 Amazon OA 出现频率有多高?
2026 年 Q1-Q2 的 SDE Intern OA 中出现率约 16%(来自一亩三分地汇总),属于稳定的中高频题。与 Robot Coordination、Warehouse Restock 一起组成 Amazon Intern OA 的「三大金刚」。
这道题给的时间够吗?
Amazon Intern OA 通常是 70 分钟 2 题。Sum of Skills 作为第一题,应在 15-20 分钟内完成,留 50 分钟给更难的第二题(通常是 DP 或图论)。
OA 系统会卡 Python 时间吗?
不会显著卡 Python。Amazon OA 给 Python 的时间限制比 C++ 多 3-5 倍,n=10^5 的滑动窗口在 Python 中 100ms 内完成,安全。
这道题用 C++ 需要注意什么?
注意 sum 的累加可能溢出 int。n=10^5, max_value=10^4 的极端情况下,sum 可能达到 10^9,刚好不溢出 int,但建议直接用 long long 防御性编程。
滑动窗口和前缀和如何选?
固定窗口大小用滑动窗口(空间 O(1)),变长查询/多次查询用前缀和(O(1) 单次查询,预处理 O(n))。OA 评分系统对两者都接受,但滑动窗口写得更快。
正在准备 Amazon Intern OA?
Amazon SDE Intern OA 的题型库相对固定,但每年都有新变体。oavoservice 持续维护 Amazon Intern OA 真题库,包含 Sum of Skills、Robot Coordination、Warehouse Restock 等 30+ 高频题的完整解题方案与变体训练。
立即添加微信:Coding0201,获取 Amazon Intern OA 真题库。
#Amazon Intern #OA #SDE Intern #滑动窗口 #算法 #北美求职
联系方式
Email: [email protected]
Telegram: @OAVOProxy