Stripe OA 歷年題裡最難「無腦暴力」通過的就是 BIN Range / Card Range Obfuscation——題面短、規則多、隱藏測試卡到位元組級。題目背後是真實的卡號反詐騙業務:BIN(Bank Identification Number)劃分卡品牌區間,若區間存在空隙,詐騙者會用「窮舉卡號」試出有效卡。Stripe 需要把空隙補全為「未知品牌」,避免被試卡。本文拆解這道題的完整解法、複雜度與隱藏測試常踩坑點。
Stripe OA 概覽(含本題)
| 維度 | 詳情 |
|---|---|
| 平台 | HackerRank for Work |
| 時長 | 90 分鐘 |
| 題量 | 1 道大題(4 個 Part) |
| 難度 | LeetCode Medium,邊界 case 極多 |
| 通過線 | 12/16 隱藏測試 |
| 出現頻率 | 2024-2026 多次出現,含變體(含 BIN 長度 6/8) |
題目描述
Stripe 卡支付 API 會返回BIN 區間與品牌的對映。
關鍵概念:
- BIN:6 位數字(部分卡 8 位)作為卡號前綴
- 卡號長度:8-19 位
- 完整 BIN 區間:所有以該 BIN 開頭的 16 位卡號
- 例:BIN=424242 →
4242420000000000 ~ 4242429999999999
- 例:BIN=424242 →
- Interval:BIN 區間的一個子區間,含
(start, end, brand)
輸入:
- BIN(6 位整數)
- 多個
(start, end, brand)三元組
輸出:
- 一個有序、不重疊、覆蓋整個 BIN 區間的 interval 列表
- 原始品牌區間保留品牌資訊
- 空隙補
"unknown"
示例
BIN = 424242
intervals = [
(4242420000000000, 4242421000000000, "VISA"),
(4242423000000000, 4242425000000000, "MASTERCARD"),
]
期望輸出:
[
(4242420000000000, 4242421000000000, "VISA"),
(4242421000000001, 4242422999999999, "unknown"),
(4242423000000000, 4242425000000000, "MASTERCARD"),
(4242425000000001, 4242429999999999, "unknown"),
]
解題思路
這是經典的區間合併 + 空隙填補。Stripe 在 HackerRank 上的隱藏測試給到 1e5 區間數量,必須 O(n log n)。
Step 1:計算 BIN 區間的全域邊界
bin_start = BIN * 10**(16 - len(str(BIN)))
bin_end = bin_start + 10**(16 - len(str(BIN))) - 1
注意 BIN 長度可能是 6 或 8,所以不要硬編碼 10**10 或 10**12——這是隱藏 case Part 3 必扣分點。
Step 2:按 start 排序輸入區間
Step 3:掃描區間,遇到空隙就插入 "unknown" 段
- 當前已覆蓋到
cursor,初始cursor = bin_start - 對每個
(s, e, brand):- 若
s > cursor:插入(cursor, s-1, "unknown") - 加入
(s, e, brand) - 更新
cursor = e + 1
- 若
- 掃描完成後,若
cursor <= bin_end:補(cursor, bin_end, "unknown")
Step 4:處理重疊區間(隱藏 case Part 4)
Stripe 在第 4 個 Part 會給重疊區間。兩種策略:
- 報錯(部分版本接受)
- 後到優先(part 4 期望寫法):用區間分裂的方式,保留後到 brand 在重疊段的覆蓋
Python 完整解法
from typing import List, Tuple
Interval = Tuple[int, int, str]
def fill_card_ranges(bin_value: int, intervals: List[Interval]) -> List[Interval]:
bin_str = str(bin_value)
span = 10 ** (16 - len(bin_str))
bin_start = bin_value * span
bin_end = bin_start + span - 1
sorted_intervals = sorted(intervals, key=lambda x: (x[0], x[1]))
result: List[Interval] = []
cursor = bin_start
for s, e, brand in sorted_intervals:
s = max(s, bin_start)
e = min(e, bin_end)
if s > e:
continue
if s > cursor:
result.append((cursor, s - 1, "unknown"))
elif s < cursor:
s = cursor
if s > e:
continue
result.append((s, e, brand))
cursor = e + 1
if cursor <= bin_end:
result.append((cursor, bin_end, "unknown"))
return result
時間複雜度:O(n log n),排序主導
空間複雜度:O(n),輸出列表
4 個隱藏測試陷阱
陷阱 1:BIN 長度不固定
題目 Part 3 會給 8 位 BIN,對應 8 位前綴 + 8 位空間。如果硬編碼 10**10 一律失敗。用 len(str(bin_value)) 動態推斷 span。
陷阱 2:輸入區間包含 BIN 區間外部分
輸入有時給 start < bin_start 或 end > bin_end,需要用 max/min 截斷到 BIN 範圍內。
陷阱 3:相鄰區間緊貼(差 1 不是 0)
如果 interval A 結束於 x,interval B 從 x+1 開始,沒有空隙——不要插入 "unknown" 段。Stripe 的邊界用 cursor = e + 1 而非 cursor = e,是為了讓「緊貼」剛好不觸發空隙邏輯。
陷阱 4:空輸入 / BIN 完全無品牌覆蓋
輸入 intervals = [] 時,必須輸出單條(bin_start, bin_end, "unknown")。容易忘記最後一段 cursor <= bin_end 的判斷。
複雜度證明
設輸入有 n 個區間:
- 排序:O(n log n)
- 掃描:O(n)
- 最壞輸出長度:2n + 1(每個區間前後各夾一個 unknown)
故總時間 O(n log n),空間 O(n)。
Stripe 評分體系:4 個 Part 如何拿滿分
| Part | 內容 | 分值 | 關鍵 |
|---|---|---|---|
| Part 1 | 單 BIN + 無重疊 + 排序輸入 | 20% | 正確 split |
| Part 2 | 無序輸入 + 空隙填補 | 30% | sorted 寫法 |
| Part 3 | BIN 長度可變 + 輸入超出 BIN 範圍 | 30% | 動態 span + 截斷 |
| Part 4 | 重疊區間處理 | 20% | 後到 brand 優先 / 報錯二選一 |
實戰策略:先把 Part 1+2 寫到 100%,再處理 Part 3 的 BIN 長度變化。Part 4 即使略掉也能拿到 80% 通過。
FAQ
Card Range Obfuscation 還在 2026 OA 出現嗎?
是的。2026 春招(Q1-Q2)至少 6 名候選人回饋遇到這道題或它的變體。變體包括:要求合併同 brand 的連續區間、給輸入區間數量上限 1e5。
為什麼 Stripe 偏愛「區間題」?
Stripe 的核心業務(payments、subscriptions、refunds)大量涉及「時間區間合併」與「金額區間分配」。OA 題的設計哲學就是**「未來你上班大概率會寫這樣的程式碼」**。
BIN 長度 6 和 8 怎麼區分?
題目會顯式告知 BIN 長度,但要在程式碼裡用 len(str(bin_value)) 推斷而不是 hard-code。隱藏測試會切換 BIN 長度來測試程式碼的健壯性。
區間是閉區間還是半開區間?
Stripe 這道題用閉區間 [start, end]。如果你寫半開區間(如 [start, end))的邏輯,所有 cursor 邊界計算都要 +1,更容易出錯。建議遵循題面閉區間風格。
這道題用 Java 寫有優勢嗎?
沒有。Python 的 sorted 在 1e5 資料規模下完全夠用(< 100ms)。Stripe 評分對所有語言一視同仁,Python 在可讀性維度甚至略占優勢。
正在準備 Stripe OA?
oavoservice 提供 Stripe 完整 OA 題庫與實戰輔助:BIN Range、Brace Expansion、Subscription Notification、Shipping Cost 等歷年題目都有完整解法與隱藏 case 複盤。我們的導師包括前 Stripe Risk 團隊工程師,熟悉 Stripe 評分系統對程式碼可讀性 + 邊界處理的雙高要求。
立即加入微信:Coding0201,獲取 Stripe OA 真題輔導。
#Stripe #StripeOA #BIN #CardRange #支付系統 #OA真題
聯絡方式
Email: [email protected]
Telegram: @OAVOProxy