最近不少同學在準備 Shopify OA ,這一家的風格其實挺“產品化”的,不是純刷 LeetCode 能完全 cover。這裡幫你整理一版常見結構 + 4–5 道高頻題,基本把核心考點覆蓋了。

Shopify Online Assessment 基本資訊(2026 最新)
- 平臺:CoderPad
- 題量:通常 2-3 道 Coding 題(主流是 3 題,少數情況 2 題)
- 時長:90 分鐘
- 難度:Easy ~ Medium-Hard,第一題較友好,後面題目逐漸增加業務邏輯和最佳化要求
- 透過關鍵:至少 2 題 Full AC,程式碼風格清晰、邊界 case 處理完整
很多候選人反饋 Shopify OA 題型相對固定,但第二、三題會加入電商業務背景,需要快速理解規則。
2026 高頻真題分享
Q1. 捆綁購物車計價(雜湊表 + 模擬)
題目描述: 輸入一個格式為 [“日期”, “商品”] 的訂單陣列。規則如下:
- 同一天同時購買了 popcorn 和 soda → 捆綁價 $9.00
- 單獨購買 popcorn → $8.00
- 單獨購買 soda → $2.50
計算並返回總價(浮點數)。
示例:
orders = [
["10212021", "popcorn"],
["10222021", "popcorn"],
["10212021", "soda"],
["10212021", "popcorn"],
["10212021", "soda"]
]
# 輸出: 28.5
解題思路:
- 用 HashMap 按日期分組,統計每天 popcorn 和 soda 的數量
- 每天可配對的捆綁數 = min(popcorn_count, soda_count)
- 剩餘未配對的按單品價格計算
- 注意浮點精度(建議用整數分計算,最後轉回美元)
參考程式碼:
from collections import defaultdict
def calculate_total(orders):
daily = defaultdict(lambda: {"popcorn": 0, "soda": 0})
for date, item in orders:
daily[date][item] += 1
total = 0.0
for items in daily.values():
p, s = items["popcorn"], items["soda"]
bundles = min(p, s)
total += bundles * 9.0
total += (p - bundles) * 8.0
total += (s - bundles) * 2.5
return total
注意事項:同一天可以有多次捆綁;注意浮點精度,面試中可用整數分(cents)避免誤差。
Q2. 最長有效括號子串(棧 / DP)
題目描述: 給定一個只包含 ‘(‘ 和 ‘)’ 的字串,返回最長有效(格式正確)括號子串的長度。
示例:
- “(()” → 2
- “)()())” → 4
- “” → 0
解題思路(推薦棧方法):
- 初始化棧,放入哨兵 -1
- 遇到 ‘(‘ 入棧
- 遇到 ‘)’ 彈出棧頂
- 若棧空,則將當前索引入棧作為新基準
- 若棧非空,更新最大長度 = 當前索引 – 棧頂索引
參考程式碼:
def longestValidParentheses(s: str) -> int:
stack = [-1]
max_len = 0
for i, ch in enumerate(s):
if ch == '(':
stack.append(i)
else:
stack.pop()
if not stack:
stack.append(i)
else:
max_len = max(max_len, i - stack[-1])
return max_len
注意事項:棧為空時要 push 當前索引作為新基準;Shopify 比較看重程式碼可讀性,棧方法比 DP 更清晰。
Q3. 判斷迴文串(雙指標 / 字串)
題目描述: 給定一個字串,判斷它是否是迴文。要求:
- 忽略標點符號和空格
- 大小寫不敏感
- 空字串視為迴文
示例:
- “A man, a plan, a canal: Panama” → True
- “race a car” → False
- ” ” → True
解題思路:
- 雙指標從兩端向中間移動
- 跳過非字母數字字元
- 比較字元(轉小寫後)
參考程式碼:
def isPalindrome(s: str) -> bool:
left, right = 0, len(s) - 1
while left < right:
while left < right and not s[left].isalnum():
left += 1
while left < right and not s[right].isalnum():
right -= 1
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
注意事項:Shopify 很看重邊界處理(空串、全符號、單字元、大小寫)。
Q4. 各地區高於均值的平均訂單收入(SQL)
題目描述: 給定 orders 表和 customers 表,找出 2024 年各地區的平均訂單收入,只返回高於所有地區整體平均值的地區及其平均收入。
解題思路(CTE 寫法推薦):
- 第一步 CTE:按地區統計 2024 年平均收入
- 第二步:在結果中過濾高於整體均值的地區
參考程式碼:
WITH region_avg AS (
SELECT
c.region,
AVG(o.revenue) AS avg_rev
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE EXTRACT(YEAR FROM o.order_date) = 2024
GROUP BY c.region
)
SELECT region, ROUND(avg_rev, 2) AS avg_rev
FROM region_avg
WHERE avg_rev > (SELECT AVG(avg_rev) FROM region_avg)
ORDER BY avg_rev DESC;
注意事項:年份過濾不能忘;要區分“各地區均值的均值”和“所有訂單的總均值”。
Q5. 字母分值單詞求和(雜湊表 / 貪心)
題目描述: 給定一個單詞列表,對每個單詞計算其“字母分值”(a=1, b=2, …, z=26),返回每個單詞的分值列表。擴充套件版可要求返回分值最高的單詞。
解題思路:
- 對每個單詞遍歷字母,用 ord(ch) – ord(‘a’) + 1 計算分值
- 如需最高分單詞,用 max() + key 引數
參考程式碼:
def word_scores(words):
def score(word):
return sum(ord(ch.lower()) - ord('a') + 1 for ch in word)
return [score(w) for w in words]
def highest_score_word(words):
def score(word):
return sum(ord(ch.lower()) - ord('a') + 1 for ch in word)
return max(words, key=score) if words else ""
注意事項:主動處理大寫字母、空字串等邊界;Shopify 比較看重程式碼風格和可讀性。
備考建議
官方推薦複習方向:演算法重點練習 LeetCode Easy–Medium,核心題目包括 #20、#32、#56、#88、#121;SQL 重點複習聚合函式、JOIN、CTE 與子查詢;邏輯推理部分可以參考 GMAT Critical Reasoning 或商業案例題。Shopify 尤其看重程式碼可讀性,變數命名清晰、邊界情況處理(如空購物車、零庫存、浮點精度)都會影響評分。建議將 OA 當作第一輪正式面試來對待,在註釋中寫清楚自己的假設。
如果你在準備 Shopify OA 時遇到具體難題,或者想針對 Shopify 高頻題型做系統模擬練習,歡迎瞭解 Programhelp 的服務。我們團隊有豐富的大廠 OA 輔導經驗,能提供針對性的實時思路指導和全真模擬,幫助你更高效地準備 Shopify、Amazon 等公司的 OA。