Anthropic SDE OA 共 90 分钟,分 4 个 Level 逐步解锁,每关必须通过全部 unit test 才能进入下一关。两道核心题分别是内存数据库(支持 TTL、备份恢复)和银行系统(存取转付 + Cashback)。题目本身不难,但功能模块多、时间紧、还要边写边改——节奏管理和代码可扩展性是关键。

Anthropic SDE OA 整体考试结构
OA 的节奏类似 CodeSignal 风格的分级闯关。每个 Level 在前一关代码基础上新增功能,因此一开始就要把代码结构设计好,后续才能平滑扩展。
| Level | 主题 | 核心难点 |
|---|---|---|
| Level 1 | 基础操作 | 建立可扩展的核心数据结构 |
| Level 2 | 筛选展示 | 字典序排序 + 严格输出格式 |
| Level 3 | TTL 存活时间 | 时间线管理 + 过期边界逻辑 |
| Level 4 | 备份 / 恢复 | 快照状态的完整持久化 |
题目一:内存数据库 详解
Level 1 — 基础 KV 操作
每条 Record 通过唯一字符串 key 访问,内含多个 field-value 对。
| 操作 | 說明 | 返回值 |
|---|---|---|
SET <key> <field> <value> |
插入或覆盖字段值,记录不存在则创建 | "" |
GET <key> <field> |
获取字段值,不存在返回空 | 值 或 "" |
DELETE <key> <field> |
删除字段 | "true" / "false" |
示例:
SET A B E → "" // {"A": {"B": "E"}}
SET A C F → "" // {"A": {"B": "E", "C": "F"}}
GET A B → "E"
GET A D → ""
DELETE A B → "true"
DELETE A D → "false"
Level 2 — 前缀筛选展示
新增扫描操作,结果格式为 field1(value1), field2(value2), ...,字段必须按字典序排列。
| 操作 | 說明 |
|---|---|
SCAN <key> |
返回所有字段(字典序) |
SCAN_BY_PREFIX <key> <prefix> |
返回以 prefix 开头的字段(字典序) |
示例:
SET A BC E → ""
SET A BD F → ""
SET A C G → ""
SCAN_BY_PREFIX A B → "BC(E), BD(F)"
SCAN A → "BC(E), BD(F), C(G)"
SCAN_BY_PREFIX B B → ""
格式细节:末尾不能有多余的
,,建议先 sort,再 join,最后 trim。
Level 3 — TTL 存活时间
所有操作新增 _AT 后缀版本,带时间戳参数。字段有效区间为 [timestamp, timestamp + ttl),过期自动失效。
| 操作 | 說明 |
|---|---|
SET_AT <key> <field> <value> <timestamp> |
带时间戳写入,永久有效 |
SET_AT_WITH_TTL <key> <field> <value> <timestamp> <ttl> |
带 TTL 写入,超时失效 |
GET_AT <key> <field> <timestamp> |
按时间戳读取(过期返回 "") |
DELETE_AT <key> <field> <timestamp> |
带时间戳删除 |
SCAN_AT <key> <timestamp> |
扫描指定时刻存活的字段 |
SCAN_BY_PREFIX_AT <key> <prefix> <timestamp> |
带前缀过滤的时间戳扫描 |
示例 1:
SET_AT_WITH_TTL A BC E 1 9 → "" // BC 在 ts=10 过期
SET_AT_WITH_TTL A BC E 5 10 → "" // 覆盖,BC 在 ts=15 过期
SET_AT A BD F 5 → ""
SCAN_BY_PREFIX_AT A B 14 → "BC(E), BD(F)"
SCAN_BY_PREFIX_AT A B 15 → "BD(F)" // BC 已过期
示例 2:
SET_AT A B C 1
SET_AT_WITH_TTL X Y Z 2 15 // Y 在 ts=17 过期
GET_AT X Y 3 → "Z"
SET_AT_WITH_TTL A D E 4 10 // D 在 ts=14 过期
SCAN_AT A 13 → "B(C), D(E)"
SCAN_AT X 16 → "Y(Z)"
SCAN_AT X 17 → "" // Y 已过期
DELETE_AT X Y 20 → "false" // X 所有字段均已过期
核心数据结构设计
// 字段值的版本单元
struct Val {
string value; // 实际值
int timestamp; // 写入时间戳
int ttl; // 0 = 永久有效
};
// 主结构:key → field → [历史版本]
unordered_map<string,
unordered_map<string,
vector<Val>>> db_;
// TTL 有效性判断(关键 helper)
auto isAlive = [&](Val& v, int ts) {
if (v.ttl == 0) return true; // 永久有效
return ts < v.timestamp + v.ttl; // 左闭右开区间
};
高频 Bug:有效区间是左闭右开
[ts, ts+ttl),判断用ts < timestamp + ttl,写成<=会导致边界 case 全错。
Level 4 — 备份与恢复
支持在指定时间点创建数据库快照,并按需恢复,完整保留字段的 TTL 状态。
BACKUP <timestamp> // 创建快照
RESTORE <timestamp> // 恢复到指定快照
题目二:银行系统 详解
第二道题是另一个高频考点,题目背景是实现简化版银行后台。每个模块独立不难,但组合后状态管理的复杂度会显著上升。
各 Level 功能模块
| Level | 功能 | 核心操作 |
|---|---|---|
| Level 1 | 账户创建 & 存款 | CREATE_ACCOUNT · DEPOSIT |
| Level 2 | 转账 & 付款 | TRANSFER · PAY |
| Level 3 | 合併賬戶 | MERGE_ACCOUNTS |
| Level 4 | Cashback | GET_CASHBACK · TOP_SPENDERS |
难点:模块组合后的状态爆炸
每个模块单独实现都属于中等难度,但当合并账户遇上 Cashback 时,问题变得棘手——合并后的账户应该如何继承原有的 Cashback 记录?转账历史如何保持一致性?
建议从 Level 2 就提前规划好交易记录的数据结构,避免到 Level 4 时大规模重构。
推荐数据结构
@dataclass
class Transaction:
tx_id: str
amount: float
timestamp: int
cashback_rate: float # 0.0 表示无 cashback,Level 4 用
cashback_settled: bool
@dataclass
class Account:
balance: float
transactions: list[Transaction] # 提前设计,后续扩展用
cashback_pending: float # Level 4 新增
# MERGE 操作核心
def merge_accounts(src: Account, dst: Account):
dst.balance += src.balance
dst.transactions += src.transactions # 历史记录合并
dst.cashback_pending += src.cashback_pending
delete_account(src)
时间分配参考
| Level | 建议用时 | 難度 | 備註 |
|---|---|---|---|
| Level 1 | ~15 min | ⭐⭐ | 打好数据结构基础 |
| Level 2 | ~20 min | ⭐⭐⭐ | 格式细节容易掉分 |
| Level 3 | ~30 min | ⭐⭐⭐⭐⭐ | TTL 逻辑最耗时 |
| Level 4 | ~25 min | ⭐⭐⭐⭐ | 备份 / Cashback 状态管理 |
两道题若在同一场考试出现,需灵活调整,优先保证高分 Level 通过。
备考建议 & 避坑指南
01. 先设计,再动手
拿到 Level 1 时就规划好整体数据结构。如果设计不可扩展,Level 3 将面临大量重构,时间根本不够。
02. TTL 边界是最高频的 Bug
有效区间是 [timestamp, timestamp+ttl),用 ts < timestamp + ttl 判断,不要写成 <=。建议封装一个 isAlive(val, ts) helper 函数统一复用。
03. SCAN 的输出格式要严格匹配
末尾不能有多余的 , ,字段必须按字典序。推荐写法:先 sort,再 join,最后 trim 末尾。
04. 银行系统要提前为 Cashback 留接口
从 Level 2 开始就在 Transaction 里预留 cashback 字段,即使暂时不用。否则 Level 4 要回头改所有 PAY 相关逻辑。
05. 时间分配是核心竞争力
Level 3 和 Level 4 分值高,很多人卡在 Level 2 的格式细节上。建议通过 Level 1 / 2 后快速进入 Level 3,不要追求完美代码。
06. 注意向后兼容要求
Level 3 新增 _AT 版本操作,但原始不带时间戳的操作仍需正常工作。题目明确说明测试用例不会混用,但你的代码要同时支持两套接口。
语言选择建议
推荐 Python:dict + dataclass 实现快,排序和字符串处理语法简洁,TTL 和 Cashback 代码量少,适合时间紧张的场景。
次选 Java / C++:如果对标准库非常熟悉(HashMap、TreeMap 等)可以选择,但字符串拼接和格式控制比 Python 繁琐,容易出 format 类 bug。
總結
Anthropic OA 的难点不在于单个算法,而在于在有限时间内设计可扩展的系统,并且在每一关都能快速迭代。建议备考时:
- 提前练习类似的分级系统设计题(CodeSignal Style)
- 熟练掌握所用语言的字符串处理和排序 API
- 在本地模拟 90 分钟限时练习,感受真实节奏
如果你最近同时在冲 Anthropic、OpenAI、Databricks、Stripe、TikTok 这类高强度 OA,担心正式笔试里卡题、来不及写完或者 hidden test 过不了,也可以提前找专业团队辅助。
ProgramHelp 这边长期提供:
- OA 在线笔试辅助(HackerRank / CodeSignal / 牛客等)
- coding test case debug 支持
- VO 面试实时思路提示
- mock interview
- SDE / Quant / DS 面试辅导
核心优势就是北美 CS 工程师团队实时协助,很多高频 OA 题库也比较熟,尤其这种系统设计型题,往往能更快定位 bug 和 hidden cases。
如果目标就是尽可能稳一点拿下面试流程,提前准备资源会轻松很多。