eBay 的软件工程实习 (SWE Intern) 是不少同学投递的"中等难度但题型很集中"的目标。和 FAANG 头部公司相比,eBay 的题面看上去没那么"花",但题型分布非常稳定——抓住核心五个主题,再配套准备 Karat 风格的 follow-up,就能把面试转化率拉满。
这篇文章把站内多篇 eBay 面经实录里的真题,按 数组前缀 / 字符串状态机 / 树与图 / 数据结构设计 / 系统设计入门 五个主题重新组织,每个主题给一道代表题 + Python 完整解法 + 时间分配建议。如果你正在准备 eBay 实习的 OA、Karat live coding 或 final loop,可以把这套题库当作"考前必过一遍"的 checklist。
eBay SWE Intern 招聘流程一览
| 阶段 | 平台 | 时长 | 题型 |
|---|---|---|---|
| Online Assessment | HackerRank | 60-75 分钟 | 2 道编码 + 部分批次 4-6 题 MCQ |
| Karat Live Coding | Karat / Zoom | 60 分钟 | 1-2 道算法 + follow-up 优化 |
| Tech Phone | Zoom + CoderPad | 45 分钟 | 1 道中等难度 + 简单 OOD/系统对话 |
| Virtual Onsite | 4 轮 × 60 分钟 | 1 个工作日 | 算法 / 系统设计 / 代码审查 / 行为题 |
要点:HackerRank OA 一般在投递后 7-10 天内发;Karat 与 Tech Phone 节奏紧凑,连续 2-3 周;Onsite 多为远程,时差需提前协调。
主题一:数组前缀和与窗口计数
真题:连续区间内不同 Promotion 数
给定一个长度 N 的数组
promo[],每个元素是当天的促销活动 id。给定 Q 个查询(l, r),返回区间内不同活动 id 的数量。N, Q ≤ 1e5。
思路:
- 离线 + Mo's Algorithm 是经典解,O((N+Q)·√N)
- eBay OA 通常给的数据规模 ≤ 1e5,可以用位置+前缀计数:把每个 id 出现的位置存进 list,对每个查询二分
from collections import defaultdict
from bisect import bisect_left, bisect_right
def distinct_in_ranges(promo, queries):
pos = defaultdict(list)
for i, p in enumerate(promo):
pos[p].append(i)
res = []
for l, r in queries:
cnt = 0
for p, idxs in pos.items():
lo = bisect_left(idxs, l)
hi = bisect_right(idxs, r)
if hi > lo:
cnt += 1
res.append(cnt)
return res
时间复杂度:O(Q · K · log N),K 是不同 id 数;当 K 较小时非常快。 空间复杂度:O(N)。
Follow-up:如果 N=1e6 且需要 online,必须用持久化线段树(主席树),可以口头描述思路即可。
主题二:字符串状态机与解析
真题:Listing Title 校验器
输入一段商品标题字符串,规则:
- 不能以小写字母开头
- 不能连续出现 3 个相同字母
- 不能包含
<>script等危险关键字- 长度 5-80
返回是否合法 + 第一个违规原因(按顺序优先级)。
思路:典型字符串校验,用一个 rule pipeline 写最清晰:
def validate_title(title: str) -> tuple[bool, str]:
if not (5 <= len(title) <= 80):
return False, "length"
if title[0].islower():
return False, "leading_lower"
for i in range(2, len(title)):
if title[i] == title[i-1] == title[i-2]:
return False, "triple_repeat"
blacklist = ("<", ">", "script", "javascript")
low = title.lower()
for kw in blacklist:
if kw in low:
return False, f"blacklist:{kw}"
return True, "ok"
时间复杂度:O(N),N 是标题长度。 面试加分:能用 enum + dataclass 把 rule 抽出来写成可扩展的 validator 链。
主题三:树与图(站点拓扑)
真题:Categories 树最大销售路径
商品类目是一棵树,每个节点有一个
sales值(可正可负)。从根到任意叶子路径的总销售额最大值是多少?
思路:
- DFS 自顶向下累加 path sum,记录最大值
- 注意销售可能是负数,路径不能"提前停下"——题目要求是到叶子,所以不能贪心剪枝
class Node:
def __init__(self, sales: int):
self.sales = sales
self.children = []
def max_leaf_path(root: Node) -> int:
best = float("-inf")
def dfs(node, acc):
nonlocal best
acc += node.sales
if not node.children:
best = max(best, acc)
return
for c in node.children:
dfs(c, acc)
dfs(root, 0)
return best
时间复杂度:O(N)。 Follow-up:如果题目改成"任意起点到任意终点"——退化成 LeetCode 124 的变体,要在每个节点合并左右最大单边路径。
主题四:数据结构设计
真题:商品搜索 LRU + 热度衰减
实现一个搜索缓存:
query(keyword, ts):返回该关键词的命中结果,并更新最近访问时间top_k(ts, k):返回截至当前时间最热门的 k 个关键词,热度 = 访问次数 × 时间衰减因子0.99^(ts - last_ts)
思路:
- 一个 dict 存关键词 → (count, last_ts)
- top_k 时按
count * (0.99 ** (ts - last_ts))排序
class HotSearch:
def __init__(self, decay=0.99):
self.decay = decay
self.data = {} # keyword -> [count, last_ts]
def query(self, keyword, ts):
if keyword not in self.data:
self.data[keyword] = [0, ts]
c, last = self.data[keyword]
# 衰减后再 +1
c = c * (self.decay ** (ts - last)) + 1
self.data[keyword] = [c, ts]
def top_k(self, ts, k):
scored = [
(kw, c * (self.decay ** (ts - last)))
for kw, (c, last) in self.data.items()
]
scored.sort(key=lambda x: -x[1])
return [kw for kw, _ in scored[:k]]
时间复杂度:query O(1),top_k O(N log N)。 Follow-up:用 bucket + heap 优化 top_k 到 O(N);面试官常问。
主题五:系统设计入门
真题:设计 eBay 商品详情页 API
要求口头设计 GET /listing/{id} 接口,覆盖:
- 缓存策略(CDN / Redis / DB)
- 高并发读怎么扛?写更新如何 invalidate?
- 商品图片、推荐位、价格历史的来源
回答骨架(P-A-S 模型:Path / API / Storage):
- Path:CDN → API Gateway → Listing Service → Cache (Redis) → MySQL
- API:返回
{listing, seller, price_history, related_listings},每块独立 fetch 后聚合(fan-out) - Storage:listing 主表 MySQL;图片 S3 + CDN;推荐位走 ML 服务;价格历史 ClickHouse 时序
- 一致性:写更新时先写 DB,再通过 CDC(Debezium)异步刷 Redis,TTL 兜底
- 抗压:热门商品在 Redis 内做 local cache,避免 thundering herd
备考策略:四周节奏
| 周次 | 主任务 |
|---|---|
| 第 1 周 | 把 LeetCode "eBay" tag + Top 50 中等题做完 |
| 第 2 周 | 主题二、三的字符串与树/图重点训练 |
| 第 3 周 | 数据结构设计 + 系统设计 P-A-S 模板演练 |
| 第 4 周 | Karat mock + 行为题 STAR 故事打磨 |
FAQ
Q1:eBay SWE Intern OA 难度和 LeetCode 比是什么水平? 大致 LeetCode Medium 偏中等,少数批次会出 1 道偏难。关键在 60 分钟内写出 bug-free 解法,不要追求最优。
Q2:HackerRank 平台有哪些坑?
默认编辑器没有 LSP;建议在本地写好再粘贴。注意输入解析常用 input().split(),不要花太多时间在 IO 上。
Q3:Karat 面试和正式 onsite 一样严格吗? Karat 是外包面试官,给分相对客观;通过率 ~50%。题目难度比 OA 略高,但允许更多沟通。
Q4:eBay 实习的实际工作内容是什么? 分散在 Listings / Search / Trust&Safety / Payments 等团队;前端 React,后端 Java + Scala,数据 Spark。
Q5:如何提升 eBay Final Loop 通过率?
- 提前研究目标 team 的产品
- 行为题准备至少 5 个 STAR 故事,覆盖 conflict / leadership / failure
- 系统设计用 P-A-S 模板,不要堆砌概念
正在准备 eBay 实习面试?
如果你已经收到 OA 链接但 60 分钟 2 题仍然吃紧,或者 Karat 阶段反复卡 follow-up,可以聊聊看 OA代面 / VO辅助 / VO代面 的全套支持方案——从面试日真人陪跑、题型映射、到行为题 STAR 故事打磨,都能端到端提供。
联系方式
需要面试真题与定制备战计划?立刻联系微信 Coding0201,获取真题。
Email: [email protected] Telegram: @OAVOProxy