Shopify 的 OA 在北美電商類公司裡屬於「易上手、難拿滿分」的代表。題面看似都是 LeetCode Medium 等級,但平台會偷偷把考點埋在電商業務語意裡:庫存怎麼分、折扣怎麼算、推薦怎麼挑——你會發現寫完程式卻跑不過 hidden test,原因往往不是演算法錯,而是沒把「業務規則」和「輸入邊界」對齊。這篇文章把 Shopify OA 拆成三類題型矩陣,每一類都給一段可直接背下來的解題骨架。
OA 流程節奏
W0 Career site / 內推投遞 → Resume screen
W1 Recruiter call(15 min)→ 發送 OA 連結
W2 HackerRank / Codility 平台 OA:60-90 min,2-3 題
W3 Tech screen(CoderPad,1 輪 60 min)
W4 VO Loop(4-5 輪:coding × 2 + system design + behavioral)
W5 Team match → offer
OA 這一關 cutoff 不算嚴苛,全 AC + 時間剩 15 分鐘以上幾乎都能進 tech screen。難點在於 hidden test:Shopify 喜歡把電商邊界塞進測試集——零庫存倉、quantity = 0、使用者買過所有商品等,寫程式碼時必須主動想到。
三大題型矩陣
| 題型 | 核心演算法 | 業務語意 | 出現頻率 |
|---|---|---|---|
| 庫存分配 | 貪心 / 模擬 | 多倉發貨優先順序 | ★★★★★ |
| 階梯折扣 | 模擬 + 邊界 | 滿 N 件減 / 買 X 送 Y | ★★★★ |
| 推薦引擎 | 共現矩陣 / 圖遍歷 | 協同過濾 top-K | ★★★ |
題型一:Inventory Allocation Optimization
題面:給定訂單陣列 orders 與倉庫陣列 warehouses,倉庫按順序發貨,庫存耗盡即失效,回傳未滿足訂單數量。
orders = [3, 5, 4]
warehouses = [8, 2, 5]
output = 1
最容易翻車的點:很多候選人第一反應是「用最大庫存倉優先」,但題面要求倉庫按順序遍歷——這是模擬題,不是貪心。
def unfulfilled_items(orders: list[int], warehouses: list[int]) -> int:
unfilled = 0
w_idx = 0
for q in orders:
remaining = q
while remaining > 0 and w_idx < len(warehouses):
take = min(remaining, warehouses[w_idx])
warehouses[w_idx] -= take
remaining -= take
if warehouses[w_idx] == 0:
w_idx += 1
unfilled += remaining
return unfilled
複雜度:O(n + m)。邊界:warehouses 含 0 項要立刻 skip;訂單為 0 不應消耗倉庫。
題型二:Discounted Price Calculation
題面:購物車每件商品有單價、數量、階梯折扣(如「買 3 付 2」),算總價。
items = [
{"price": 10, "quantity": 5, "discount": (3, 2)}, # buy 3 pay 2
{"price": 20, "quantity": 2, "discount": None}
]
output = 10 * 4 + 20 * 2 = 80
陷阱:5 件商品裡能湊出1 個 (3,2) 組合 + 2 件原價,所以付費數 = floor(5/3) * 2 + 5 % 3 = 4。很多人寫成 5 - 5 // 3,丟了餘數。
def cart_total(items: list[dict]) -> int:
total = 0
for it in items:
price, qty = it["price"], it["quantity"]
d = it.get("discount")
if d:
buy, pay = d
groups = qty // buy
leftover = qty % buy
paid_qty = groups * pay + leftover
else:
paid_qty = qty
total += price * paid_qty
return total
邊界:buy = 0、pay > buy(題面允許「贈 X 件」)、quantity < buy 都要單獨處理。
題型三:Product Recommendation Engine
題面:購買矩陣 purchases[i][j] = 1 表示使用者 i 買過商品 j。為每位使用者輸出 top-3 共現推薦,排除已買過的。
from collections import defaultdict, Counter
def recommend(purchases: list[list[int]], k: int = 3) -> list[list[int]]:
n_users = len(purchases)
n_items = len(purchases[0])
cooccur = defaultdict(Counter)
for user in purchases:
bought = [j for j, v in enumerate(user) if v]
for a in bought:
for b in bought:
if a != b:
cooccur[a][b] += 1
out = []
for i in range(n_users):
scores = Counter()
for j in range(n_items):
if purchases[i][j]:
scores.update(cooccur[j])
for j in range(n_items):
if purchases[i][j]:
scores.pop(j, None)
top = [item for item, _ in scores.most_common(k)]
out.append(top)
return out
複雜度:建構 O(U·B²),推薦 O(N·B·I)。坑:題面要求「排除已買過的」必須最後一步再做,否則會汙染 score。
OA 通關節奏(90 分鐘版)
00:00 - 00:05 通讀 3 題,標記最熟的一題先做
00:05 - 00:25 Q1 模擬 / 陣列類 → 100% AC
00:25 - 00:55 Q2 業務建模題 → 80%+ AC
00:55 - 01:20 Q3 資料結構題 → 50%+ AC
01:20 - 01:30 回頭跑 hidden case 邊界(空陣列 / 單元素 / 全 0 輸入)
最後 10 分鐘留給「業務邊界檢查」是 Shopify OA 的特殊節奏:往主流程裡塞一句 if not orders: return 0 這種小補丁,往往就是分數差距來源。
不同職缺線的 OA 差異
| 職缺線 | OA 題型偏好 | 時長 | 平台 |
|---|---|---|---|
| Backend SDE | 庫存 + 折扣模擬 | 60-90 min | HackerRank |
| Data / ML | 推薦引擎 + 矩陣分析 | 90 min | HackerRank |
| SRE / Infra | 限流 / 佇列模擬 | 75 min | Codility |
| Frontend | DOM tree 模擬 + JS API | 60 min | HackerRank |
如果你拿到的題面是「Order processing pipeline simulation」,幾乎可以判斷是 Backend SDE 線;如果題面帶 users × items 矩陣,多半是 Data / ML 線。
OA 輔助怎麼對接 Shopify
Shopify OA 的難點不在演算法,而在業務邊界 + hidden test。OA 輔助 / OA代面 在 Shopify 這條線的標準節奏:
- 職缺線判定:根據 JD 關鍵字(Liquid / Ruby on Rails / Hydrogen)鎖定 SDE / Data / Frontend 線
- 題型預判:庫存 / 折扣 / 推薦三類挑出最高頻兩類提前 mock
- 限時 mock:90 分鐘擬真,提前練「最後 10 分鐘邊界回掃」節奏
- 現場 cue:OA 當天後台拉骨架程式碼 + hidden test 提示
- 覆盤:OA 提交後回放,識別得分 vs 實際 AC 差距
FAQ
Q1: Shopify OA 的 cutoff 是多少? A: 平台會顯示一個 score(滿分 300 / 題),實際通過線大約 220-240,3 題全 AC + 邊界覆蓋即可穩過。
Q2: 可以選語言嗎? A: HackerRank 預設提供 15+ 語言,Shopify 推薦 Python / Ruby / JavaScript / Go。後端職缺提交 Ruby 會獲得輕微加成。
Q3: OA 會有 plagiarism check 嗎? A: 會。Shopify 用 HackerRank 自帶相似度檢測,且會比對歷史候選程式碼。直接抄題解會被標記。
Q4: OA 後多久收到 tech screen 邀請? A: 一般 5-7 個工作日。如果 10 天沒動靜,可以禮貌郵件 recruiter 跟進一次。
Q5: 三道題做不完該怎麼取捨? A: 優先保證 Q1 和 Q2 全 AC,Q3 拿部分 case 即可。Shopify 評分對「完整性」加權高於「數量」。
寫在最後
Shopify OA 最值得訓練的不是演算法本身,而是把電商規則翻譯成程式碼的能力。如果你正在準備 Shopify 的 OA,可以微信 Coding0201 聯繫,傳職缺 JD + 目前階段,先做職缺線判定,再排 OA 輔助 / OA代面 的節奏。
需要面試真題? 立刻聯繫微信 Coding0201,取得真題。
聯絡方式
- 微信:Coding0201
- Email: [email protected]
- Telegram: @OAVOProxy