Anthropic SDE OA 面经|内存数据库+银行系统详解(附代码)

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

Anthropic SDE OA 面经|内存数据库+银行系统详解(附代码)

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 版本操作,但原始不带时间戳的操作仍需正常工作。题目明确说明测试用例不会混用,但你的代码要同时支持两套接口。

语言选择建议

推荐 Pythondict + dataclass 实现快,排序和字符串处理语法简洁,TTL 和 Cashback 代码量少,适合时间紧张的场景。

次选 Java / C++:如果对标准库非常熟悉(HashMapTreeMap 等)可以选择,但字符串拼接和格式控制比 Python 繁琐,容易出 format 类 bug。

總結

Anthropic OA 的难点不在于单个算法,而在于在有限时间内设计可扩展的系统,并且在每一关都能快速迭代。建议备考时:

  1. 提前练习类似的分级系统设计题(CodeSignal Style)
  2. 熟练掌握所用语言的字符串处理和排序 API
  3. 在本地模拟 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。

如果目标就是尽可能稳一点拿下面试流程,提前准备资源会轻松很多。

author avatar
Jory Wang Amazon資深軟體開發工程師
Amazon 資深工程師,專注 基礎設施核心系統研發,在系統可擴充套件性、可靠性及成本最佳化方面具備豐富實戰經驗。 目前聚焦 FAANG SDE 面試輔導,一年內助力 30+ 位候選人成功斬獲 L5 / L6 Offer。
END
 0