我最近辅助了几位同学完成了 Amazon HackerRank OA(包括 SDE Intern 和 New Grad)。Amazon OA 主流是 2 道 Coding 题(90 分钟),偶尔会出现 3 道,但整体题型风格稳定。为了帮助大家高效备考,我把近期多场 OA 中出现频率最高、重复率较高的 5 道高频真题 整理出来,附上详细解题思路和代码模板,供大家参考。

Amazon HackerRank OA 整体情况
- 平台:HackerRank
- 题量:主流 2 道 Coding 题(少数 3 道)
- 时长:90 分钟
- 难度:第一题 Easy-Medium,第二题 Medium-Hard
- 特点:第二题描述较长,边界条件多,时间压力较大
下面是 2026 年 5 月近期高频的 5 道代表性真题:
Amazon HackerRank OA 高频真题详解
1. 库存分配算法(Medium-Hard)
题目:在限时抢购活动中,顾客提交请求 [customerId, quantity, bidAmount, timestamp]。按出价优先、相同出价按时间戳轮询分配,每次每人最多分配 1 件,直到库存耗尽。返回没有获得任何商品的顾客 ID 列表(升序)。
解题思路:
- 先按 bidAmount 降序、timestamp 升序排序
- 使用优先队列或排序后模拟轮询分配
- 记录每位顾客已获得的商品数量
核心代码框架(Python):
def getUnfulfilledCustomers(requests, totalInventory):
# requests = [customerId, quantity, bidAmount, timestamp]
customers = sorted(requests, key=lambda x: (-x[2], x[3]))
from collections import defaultdict
allocated = defaultdict(int)
for cust in customers:
cid, qty, bid, ts = cust
while qty > 0 and totalInventory > 0 and allocated[cid] < qty:
allocated[cid] += 1
totalInventory -= 1
unfulfilled = [cid for cid, req in requests if allocated[cid[0]] == 0]
return sorted(set(unfulfilled))
2. 电影搜索(Django 代码片段修复)
题目:给出了一个 search_movies 的 Django 视图代码片段(见下方),需要实现或完善电影搜索接口。接口支持:
- 按年份精确筛选
year,或范围min_year/max_year; - 按导演
director、编剧writer模糊搜索(大小写不敏感); - 按评分
rating降序,平分时按人气popularity降序; - 返回 JSON 列表,包含电影的详细字段。
参考代码
def search_movies(request):
year = request.GET.get(‘year’)
min_year = request.GET.get(‘min_year’)
max_year = request.GET.get(‘max_year’)
director = request.GET.get(‘director’)
writer = request.GET.get(‘writer’)
movies_qe = Movie.objects.all()
if year:
movies_qe = movies_qe.filter(year=int(year))
else:
if min_year:
movies_qe = movies_qe.filter(year__gte=int(min_year))
if max_year:
movies_qe = movies_qe.filter(year__lte=int(max_year))
if director:
movies_qe = movies_qe.filter(director__icontains=director.strip())
if writer:
movies_qe = movies_qe.filter(writers__icontains=writer.strip())
movies_qe = movies_qe.order_by('-rating', '-popularity')
movies = []
for movie in movies_qe:
movies.append({
'_id': str(movie.id),
'title': movie.title,
'year': movie.year,
'duration': movie.duration,
'rating': movie.rating,
'popularity': movie.popularity,
'genre': movie.genre,
'description': movie.description,
'director': movie.director,
'writers': movie.writers,
'stars': movie.stars,
})
return JsonResponse(movies, safe=False)
3. SQL:拍卖网站中标者查询(高频)
题目:网站采用“加价竞拍”,买家可无限次加价,每次加价幅度由卖家预设。出价最高(即最后一次出价)的买家中标。请编写 SQL 查询返回所有拍品的信息:
| 字段 | 说明 |
|---|---|
| name | 拍品名称 |
| starting_price | 起拍价 |
| bid_step | 每次加价幅度 |
| bids | 总出价次数 |
| current_price | 当前价格 = 起拍价 + 加价幅度 × 出价次数 |
| current_winner | 最后一次出价的买家用户名 |
结果按 name 升序排列。
假设表结构
items表:id, name, starting_price, bid_stepbids表:id, item_id, bidder_name, bid_time(每次出价记录)
解题思路
- 在
bids表中按item_id分组,获取出价次数和最后出价的买家; - 最后出价者可通过窗口函数
ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY bid_time DESC)或聚合时利用LAST_VALUE/ 相关子查询获得; - 与
items表 JOIN,计算current_price。
参考 SQL:
SELECT
i.name,
i.starting_price,
i.bid_step,
COUNT(b.id) AS bids,
i.starting_price + i.bid_step * COUNT(b.id) AS current_price,
(SELECT buyer_username FROM bids
WHERE item_id = i.id
ORDER BY bid_time DESC LIMIT 1) AS current_winner
FROM items i
LEFT JOIN bids b ON i.id = b.item_id
GROUP BY i.id
ORDER BY i.name ASC;
4. REST API:国家电话代码格式化
题目:根据国家名称调用 API 获取区号,格式化电话号码为 +区号 电话号码,未找到国家返回 -1。
解题思路:
- 调用 https://jsonmock.hackerrank.com/api/countries?name={country}
- 取 callingCodes 数组中最后一个区号
- 格式化返回
5. 密码强度验证
题目:根据规则判断密码是“弱密码”还是“强密码”。
弱密码条件:
- 包含常用词
- 仅数字
- 仅大写或仅小写
- 长度 < 6
解题思路:逐条检查规则,返回对应结果。
从刷题低效到顺利通过 Amazon OA
这次很高兴能帮助这批同学顺利通过 Amazon HackerRank OA。我发现很多同学在准备 OA 时,光靠自己刷题效率其实不高,特别容易在时间分配和复杂题型的边界处理上吃亏。
如果你也在准备 Amazon SDE Intern、New Grad 或其他大厂的 HackerRank OA,感觉一个人复习效率低、方向模糊,欢迎联系 Programhelp。
我们会根据你的具体水平和弱点,提供专业的 OA 实战辅助服务和一对一指导。