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