← 返回部落格列表 Stripe OA 真題深度複盤:Card Range Obfuscation(BIN 區間填補)完整解法|2026
Stripe

Stripe OA 真題深度複盤:Card Range Obfuscation(BIN 區間填補)完整解法|2026

2026-05-14

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 = 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**1010**12——這是隱藏 case Part 3 必扣分點。

Step 2:按 start 排序輸入區間

Step 3:掃描區間,遇到空隙就插入 "unknown"

Step 4:處理重疊區間(隱藏 case Part 4)

Stripe 在第 4 個 Part 會給重疊區間。兩種策略:

  1. 報錯(部分版本接受)
  2. 後到優先(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_startend > 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)。

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