最近不少同学在准备 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。