Anthropic SDE OA 面經|記憶體資料庫+銀行系統詳解(附程式碼)

1,523Views

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>> 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 版本操作,但原始不帶時間戳的操作仍需正常運作。題目明確說明測試案例不會混用,但你的程式碼要同時支援兩套介面。

語言選擇建議

推薦 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