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>> 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 // 建立快照
RESTORE // 還原到指定快照
題目二:銀行系統 詳解
第二道題是另一個高頻考點,題目背景是實現簡化版銀行後臺。每個模組獨立不難,但組合後狀態管理的複雜度會顯著上升。
各 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。
如果目標就是儘可能穩一點拿下面試流程,提前準備資源會輕鬆很多。