一句話摘要:Ramp OA 是 CodeSignal Industry 風格的 4 題遞增設計——一道貫穿全場的「銀行交易系統」,每題在前一題基礎上加新規則。關鍵不是會演算法,而是能不能乾淨地組織程式碼。
Ramp 是美國知名的 B2B 財務自動化(公司卡 + 報銷 + 帳單支付)獨角獸,工程文化非常推崇「reliability」,因此 OA 完全模仿真實業務——你做的每一道題都像在 build 一個 mini banking core。這篇文章按 2026 年最新真題給出完整解析。
一、Ramp OA 基本資訊
| 項目 | 詳情 |
|---|---|
| 平台 | CodeSignal Industry Coding Framework |
| 時長 | 70 分鐘 |
| 題數 | 4 道(遞增式:Level 1 → Level 4) |
| 語言 | Python / TypeScript / Go / Java |
| 通過線 | 通常 3 道全 AC + 第 4 道部分通過 |
| 測試用例 | 每題 ~15 個 hidden tests |
最大特點:4 道題共享同一個資料模型(帳戶、交易、退款),後題在前題程式碼上擴充。這意味著:
- 第 1 題寫得好 → 後面省一半時間
- 第 1 題程式碼亂 → 第 4 題基本不可能 AC
二、4 道題完整解析(Bank Transaction System)
Level 1:基礎帳戶操作
題目:實現 4 個 API:
CREATE_ACCOUNT(timestamp, account_id)DEPOSIT(timestamp, account_id, amount)PAY(timestamp, account_id, amount)TOP_K_ACCOUNTS_BY_OUTGOING_PAYMENTS(timestamp, k)
思路:HashMap 存帳戶餘額 + HashMap 存累計支出。
class BankSystem:
def __init__(self):
self.balances = {}
self.outgoing = {}
def create(self, ts, acc):
if acc in self.balances:
return ""
self.balances[acc] = 0
self.outgoing[acc] = 0
return "true"
def deposit(self, ts, acc, amt):
if acc not in self.balances:
return ""
self.balances[acc] += amt
return str(self.balances[acc])
def pay(self, ts, acc, amt):
if acc not in self.balances or self.balances[acc] < amt:
return ""
self.balances[acc] -= amt
self.outgoing[acc] += amt
return str(self.balances[acc])
def top_k(self, ts, k):
ranked = sorted(self.outgoing.items(),
key=lambda x: (-x[1], x[0]))
return ", ".join(f"{a}({v})" for a, v in ranked[:k])
Level 2:轉帳與時間排序
新增 API:
TRANSFER(timestamp, source_id, target_id, amount)
注意:轉帳要保證原子性(任一帳戶失敗則全失敗)。
def transfer(self, ts, src, tgt, amt):
if src == tgt or src not in self.balances or tgt not in self.balances:
return ""
if self.balances[src] < amt:
return ""
self.balances[src] -= amt
self.balances[tgt] += amt
self.outgoing[src] += amt
return str(self.balances[src])
Level 3:定時退款(Refund Queue)
新增 API:
SCHEDULE_REFUND(timestamp, account_id, amount, delay_ms):在 timestamp + delay_ms 後退款- 後續所有操作都要先掃描已到期的退款並執行
思路:用最小堆維護待執行退款,每次 API 呼叫前 flush 到當前時間。
import heapq
class BankSystem:
def __init__(self):
self.balances = {}
self.outgoing = {}
self.pending = []
def _flush(self, now):
while self.pending and self.pending[0][0] <= now:
ts, acc, amt = heapq.heappop(self.pending)
if acc in self.balances:
self.balances[acc] += amt
def schedule_refund(self, ts, acc, amt, delay):
self._flush(ts)
if acc not in self.balances:
return ""
heapq.heappush(self.pending, (ts + delay, acc, amt))
return "true"
關鍵易錯點:每個 API 入口都要先呼叫 _flush(ts),否則後續 query 會讀到過期資料。
Level 4:消費限額(Spending Limit)
新增 API:
SET_PAYMENT_LIMIT(timestamp, account_id, limit, window_ms):在過去 window_ms 內總支出不能超過 limit
思路:每個帳戶維護一個雙端佇列記錄最近支出 (timestamp, amount),每次 PAY 前清理過期紀錄。
from collections import deque
class BankSystem:
def __init__(self):
self.balances = {}
self.outgoing = {}
self.pending = []
self.limits = {}
self.recent_pay = {}
def set_limit(self, ts, acc, limit, window):
if acc not in self.balances:
return ""
self.limits[acc] = (limit, window)
self.recent_pay.setdefault(acc, deque())
return "true"
def pay(self, ts, acc, amt):
self._flush(ts)
if acc not in self.balances:
return ""
if acc in self.limits:
limit, window = self.limits[acc]
dq = self.recent_pay[acc]
while dq and dq[0][0] < ts - window:
dq.popleft()
recent_total = sum(a for _, a in dq)
if recent_total + amt > limit:
return ""
if self.balances[acc] < amt:
return ""
self.balances[acc] -= amt
self.outgoing[acc] += amt
if acc in self.limits:
self.recent_pay[acc].append((ts, amt))
return str(self.balances[acc])
複雜度:每次 PAY 均攤 O(1)(雙端佇列)。
三、4 題難度與時間分配
| 題號 | 難度 | 推薦用時 | 關鍵技巧 |
|---|---|---|---|
| Level 1 | ⭐ | 8 min | 乾淨的 HashMap + 排序 |
| Level 2 | ⭐⭐ | 12 min | 轉帳原子性 |
| Level 3 | ⭐⭐⭐ | 20 min | 優先佇列 + flush 機制 |
| Level 4 | ⭐⭐⭐⭐ | 25 min | 雙端佇列 + 限額檢查 |
時間預算:留 5 分鐘給 debug,不要追求 4 題全 AC,3 題 AC + 第 4 題部分通過 = 進面試。
四、Ramp OA 備考策略
| 階段 | 週期 | 重點 |
|---|---|---|
| 基礎 | 1 週 | LeetCode 設計題 30 題(LRU、Twitter、HashMap) |
| 模擬 | 1 週 | CodeSignal Industry Framework 官方 Bank/Inventory 模板 |
| 衝刺 | 3 天 | Ramp 風格 4 題真題 + 時間分配 |
重要原則:
- 不要每題重寫:把 Level 1 的 class 寫成可擴充的,後面只加方法
- 統一回傳格式:所有 API 失敗回傳
"",成功回傳字串數字 - 預留 _flush hook:從 Level 1 就埋好鉤子,Level 3 直接接入
五、FAQ:Ramp OA / Ramp CodeSignal 高頻問答
Q1:Ramp OA 多少分能進面?
通常 3 題全 AC + 第 4 題 50%+ 部分通過。CodeSignal 滿分 600,建議 ≥ 480。
Q2:Ramp OA 可以用 ChatGPT 輔助嗎?
官方禁止 AI 輔助。CodeSignal 部分版本會監控鍵盤行為與瀏覽器切換,作弊會被永久封禁。
Q3:Ramp OA 題庫會變嗎?
Bank System 模板半年內變化不大,但具體 API 名稱、欄位會換。所以重點是理解模式,不是背程式碼。
Q4:用 Python 還是 TypeScript?
Python 寫得最快。TypeScript 適合後端候選人,但 OA 階段不影響排名。
Q5:Ramp OA 之後流程是什麼?
OA 通過 → 1 輪 Recruiter Call → 1 輪 Phone Coding → Onsite(2 Coding + 1 SD + 1 BQ + 1 Hiring Manager)。
Q6:Ramp OA 看哪些 LeetCode 標籤?
Design + HashMap + Heap。重點:LC 146 (LRU), LC 355 (Twitter), LC 460 (LFU), LC 1396 (Subway Stat)。
六、外部連結資源
🚀 需要 Ramp OA / VO 輔助?
如果你正在準備 Ramp、Brex、Stripe、Mercury 等 Fintech 公司的 OA / VO,歡迎交流:可提供 CodeSignal Industry 風格題型拆解、設計題程式碼組織模板與 onsite SD 模擬。
👉 立即加微信:Coding0201,取得真題與一對一備考方案
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy