我最近輔助了幾位同學完成了 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 實戰輔助服務和一對一指導。