近期 Amazon 再次開啟大規模 Online Assessment 發放,本輪 OA 統一使用 HackerRank 平台。從 oavoservice 實際輔導與學員反饋來看,這一批 OA 的題目結構非常穩定,但對候選人的建模能力、資料結構選擇以及邊界條件處理提出了更高要求。
不少同學在做完之後的共同感受是:
題目本身並不偏難,但一旦理解偏差,後續程式碼幾乎無法挽回。
本文基於真實 OA 反饋,對本輪 Amazon OA 的兩道 Coding 題進行系統性復盤。
📊 Amazon OA 基本資訊概覽
| 項目 | 詳情 |
|---|---|
| 測試平台 | HackerRank |
| 題目數量 | 2 道 Coding |
| 整體難度 | 中等偏上 |
| 主要考察 | 複雜業務規則抽象、動態資料結構、貪心策略、邊界條件 |
✅ 第一題:伺服器實例分配與 Cost 計算
題目背景
系統中存在若干台伺服器,每台伺服器擁有一定數量的空閒實例。伺服器狀態以陣列形式給出,陣列下標代表伺服器編號,數值代表當前可用實例數量。
現在有 m 位客戶依次到來,每一位客戶都需要選擇一台伺服器租用一個實例。伺服器的狀態會隨著客戶的選擇不斷發生變化。
分配與 Cost 規則
對每一位客戶,系統會執行如下操作:
- 在當前所有伺服器中,選擇空閒實例數量最多的伺服器
- 成功選擇後,該伺服器的空閒實例數量 減 1
- 本次選擇會產生一個 cost,計算方式為:
cost = 選擇前的最小空閒實例數 + 選擇前的最大空閒實例數
最終要求: 在 m 位客戶完成分配之後,輸出所有 cost 的累計總和。
解題本質分析
這是一道非常典型的 Amazon 風格題目,本質並不是考察複雜演算法,而是考察候選人是否能夠:
- 快速識別這是一個動態維護最大值和最小值的問題
- 在多次更新場景下,避免使用低效的全陣列掃描
🤯 主要失分原因
- 沒有意識到 cost 必須在「選擇之前」計算
- 每輪透過遍歷陣列尋找最大/最小值,導致 TLE
- 沒有正確處理實例數量減到 0 後的伺服器狀態
oavoservice 滿分解法
使用堆結構來維護伺服器狀態:
import heapq
def calculateTotalCost(servers, m):
if not servers or m == 0:
return 0
# 最大堆(取負值模擬)
max_heap = [-x for x in servers if x > 0]
heapq.heapify(max_heap)
# 維護最小值(可用 Counter 或排序結構)
from collections import Counter
count = Counter(servers)
total_cost = 0
for _ in range(m):
if not max_heap:
break
# 當前最大值(選擇前)
current_max = -max_heap[0]
# 當前最小值(選擇前)
current_min = min(k for k, v in count.items() if v > 0)
# 計算 cost(選擇前)
total_cost += current_max + current_min
# 執行分配:最大值伺服器減 1
heapq.heappop(max_heap)
count[current_max] -= 1
new_val = current_max - 1
if new_val > 0:
heapq.heappush(max_heap, -new_val)
count[new_val] += 1
return total_cost
複雜度分析
- Time: O(m log n),每次堆操作 O(log n)
- Space: O(n),儲存堆和計數器
✅ 第二題:零件倉庫分配最大化問題
題目背景
系統中存在多個 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 的限制
常見錯誤
- 忽略 warehouse 單一 log 來源的限制
- 只關注整體零件數量,而不考慮排序後的分布
- 預設所有零件必須被分配,導致尾部 warehouse 被壓低
oavoservice 解題思路
def maxBottomHalfSum(logs, k):
"""
logs: 每個 log 的零件數量陣列
k: warehouse 數量(偶數)
目標: 最大化排序後後 k/2 個 warehouse 的總和
"""
# 關鍵洞察:要讓後半部分盡可能大,就要讓分配盡量均衡
# 使用二分搜尋找到最優的「最小分配值」
def canAchieve(min_val):
"""檢查是否能讓所有 warehouse 至少儲存 min_val 個零件"""
warehouses_filled = 0
for log in logs:
# 每個 log 可以填充的 warehouse 數量
warehouses_filled += log // min_val
return warehouses_filled >= k
# 二分搜尋最大的 min_val
left, right = 1, max(logs) if logs else 0
result = 0
while left <= right:
mid = (left + right) // 2
if canAchieve(mid):
result = mid
left = mid + 1
else:
right = mid - 1
# 後 k/2 個 warehouse 的總和
return result * (k // 2)
注意: 以上是簡化思路,實際題目可能有更多約束,需要根據具體輸入調整。
💡 Amazon OA 真實風格總結
從這兩道題可以看出 Amazon OA 的考察重點:
| 考察維度 | 具體表現 |
|---|---|
| 業務建模 | 題目描述長,需要快速抽象出核心邏輯 |
| 資料結構 | 堆、優先佇列、雜湊表的靈活運用 |
| 邊界處理 | 空陣列、0 值、極端情況 |
| 優化目標 | 看清「真正要最大化/最小化什麼」 |
🎯 為什麼很多人選擇 oavoservice?
在 oavoservice 的真實案例中,很多同學的問題並不是「完全不會寫」,而是:
- OA 時間不足,來不及試錯
- 題目規則複雜,容易在細節處踩坑
- 平台限制嚴格,一次失誤直接淘汰
Amazon OA 的本質是篩人而不是教學。在這種情況下,選擇穩定、合規、經驗成熟的專業支持,往往比單純「再刷幾道題」更有效。
🚀 oavoservice:你的 Amazon OA 滿分通關保障
我們專業提供 OA 代寫服務,確保所有測試用例 100% 通過,不通過所有測試用例不收費。
✅ HackerRank 全平台覆蓋 — 熟悉 Amazon 題庫風格
✅ 遠端無痕操作 — 透過遠端控制實現,確保安全
✅ 滿分保障 — 不通過不收費
✅ 7x24 小時在線 — 隨時待命
適用於 HackerRank、牛客網、CodeSignal 等主流平台。
We consistently provide professional online assessment services for major tech companies like Amazon, Google, Meta, and TikTok, guaranteeing perfect scores. Feel free to contact us if you're interested.
👉 立即添加微信:Coding0201
鎖定你的 Amazon 面試機會!