BCG X OA 2026 最新真題曝光|90分鐘4題全流程真實難度解析

BCG X OA 使用 HackerRank 平臺,時長 90 分鐘,題型構成相對固定:20–25 道 MCQ(涵蓋 SQL、Python/Pandas、基礎統計和商業邏輯) + 2 道 Coding / Data Analysis 題(一道偏業務分析,一道偏程式碼實現)。整體難度中等,但時間壓力較大,尤其需要同時兼顧準確率和編碼效率。

和傳統網際網路公司的純演算法 OA 不同,BCG X 更注重“資料 + 業務”的結合,考察你能否用資料工具快速解決實際業務問題。

BCG X OA 2026 最新真題曝光|90分鐘4題全流程真實難度解析

題目 1:字串壓縮演算法

題目描述

為減少網際網路傳輸的訊息大小,某壓縮演算法會對字串中連續重複的字元進行編碼。

你的任務是按照以下規則壓縮給定字串:

  1. 從左到右掃描字串,將連續相同的字元分為一組。
  2. 如果某個字元僅出現一次,則直接將該字元新增到輸出結果中。
  3. 如果某個字元連續出現多次,則將字元和它的連續出現次數拼接後,新增到輸出結果中。

示例

輸入字串 message = "aabbccca"

輸出結果:"a2b2c3a"

約束條件

  • 字串中的所有字元均為小寫字母 a-z
  • 字串長度 ≤ 10⁵。

解題思路

  • 遍歷字串,用變數記錄當前字元和連續計數。
  • 遇到不同字元時,按規則拼接結果並重置計數。
  • 最後一組字元也需要單獨處理。

Python 實現

def compress_string(message: str) -> str:
    if not message:
        return ""
    
    result = []
    current_char = message[0]
    count = 1
    
    for char in message[1:]:
        if char == current_char:
            count += 1
        else:
            result.append(current_char)
            if count > 1:
                result.append(str(count))
            current_char = char
            count = 1
    
    # 處理最後一組字元
    result.append(current_char)
    if count > 1:
        result.append(str(count))
    
    return "".join(result)

# 測試
print(compress_string("aabbccca"))  # 輸出: a2b2c3a

題目 2:服務 Pods 與資料庫查詢

題目描述

一個系統有 n 個服務 Pod,編號為 1 到 n,透過 m 條鏈路互聯(由陣列 connections 表示)。直接或間接相連的 Pod 屬於同一個區域。

每個 Pod 都有資料庫連線。當一個 Pod 的連線失效時,該區域的所有流量會自動轉發到該區域內ID 最小的正常 Pod;如果區域內沒有正常 Pod,則無法寫入資料。

處理 q 個查詢,分為兩類:

  1. 資料傳送查詢:"1 pod_id" → 向該 Pod 傳送資料,返回最終寫入資料的 Pod ID(或 – 1)。
  2. 資料庫連線失效查詢:"2 pod_id" → 標記該 Pod 為失效狀態。

返回一個陣列,包含所有資料傳送查詢的結果。

示例

  • n = 3
  • m = 2
  • connections = [[1, 2], [2, 3]]
  • queries = [[2, 2], [1, 2], [2, 1], [2, 3], [1, 1]]

過程:

  1. Pod 2 失效。
  2. 向 Pod 2 傳送資料,轉發到區域內 ID 最小的正常 Pod(1),結果為 1。
  3. Pod 1 失效。
  4. Pod 3 失效。
  5. 向 Pod 1 傳送資料,區域內無正常 Pod,結果為 – 1。

返回:[1, -1]

解題思路

  • 先用並查集(Union-Find)預處理每個 Pod 所在的連通區域,記錄每個區域的最小 ID。
  • 維護每個 Pod 的狀態(正常 / 失效)。
  • 處理查詢時,根據區域和狀態返回結果。

Python 實現

class DSU:
    def __init__(self, size):
        self.parent = list(range(size + 1))
        self.min_id = list(range(size + 1))  # 每個集合的最小ID
    
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def union(self, x, y):
        xr, yr = self.find(x), self.find(y)
        if xr == yr:
            return
        if xr < yr:
            self.parent[yr] = xr
            self.min_id[xr] = min(self.min_id[xr], self.min_id[yr])
        else:
            self.parent[xr] = yr
            self.min_id[yr] = min(self.min_id[yr], self.min_id[xr])


def pod_queries(n, m, connections, queries):
    dsu = DSU(n)
    for u, v in connections:
        dsu.union(u, v)
    
    active = [True] * (n + 1)
    result = []
    
    for query in queries:
        t, pod_id = query
        if t == 2:
            active[pod_id] = False
        else:
            root = dsu.find(pod_id)
            min_active = -1
            # 找區域內最小的正常Pod
            for i in range(1, n + 1):
                if dsu.find(i) == root and active[i]:
                    min_active = i
                    break
            result.append(min_active)
    
    return result

# 測試
print(pod_queries(3, 2, [[1, 2], [2, 3]], [[2, 2], [1, 2], [2, 1], [2, 3], [1, 1]]))
# 輸出: [1, -1]

題目 3:圖的不同構型數量

題目描述

給定 n 個節點,每個不同的節點對之間可以選擇連邊或不連邊(無自環、無重邊)。求所有可能的不同構型的無向圖總數,結果對 10⁹ + 7 取模。

示例 1n = 3

節點間共有 C(3,2) = 3 條可能的邊,每條邊可選 / 不選,總共有 2³ = 8 種不同構型,因此返回 8。

示例 2n = 4

節點間共有 C(4,2) = 6 條可能的邊,總共有 2⁶ = 64 種不同構型。

解題思路

  • 無向圖中,n 個節點的無向邊總數為組合數 C(n, 2) = n*(n-1)/2
  • 每條邊有兩種狀態(存在 / 不存在),因此總構型數為 2^(n*(n-1)/2) mod (10⁹+7)

Python 實現

MOD = 10**9 + 7

def count_graph_configurations(n: int) -> int:
    if n < 2:
        return 1  # 0或1個節點時,只有1種構型
    
    edges = n * (n - 1) // 2
    return pow(2, edges, MOD)

# 測試
print(count_graph_configurations(3))  # 輸出: 8
print(count_graph_configurations(4))  # 輸出: 64

題目 4:字串解壓演算法

題目描述

為還原被壓縮的網際網路傳輸訊息,需實現對應的字串解壓演算法,解壓規則與題目 1 的壓縮規則反向對應,具體要求如下:

  1. 掃描字串,識別字元與緊跟的連續數字(數字僅表示當前字元的連續出現次數,且為正整數)。
  2. 若字元後無數字,說明該字元僅出現 1 次,直接保留到輸出結果中。
  3. 若字元後有數字,說明該字元連續出現該數字次,將字元重複對應次數後拼接至輸出結果中。
  4. 輸入字串僅包含小寫字母 a-z 和數字 0-9,且數字僅緊跟在對應字元後出現,無無效格式。

示例

示例 1

輸入字串:"a2b2c3a"

輸出結果:"aabbccca"

示例 2

輸入字串:"x5y3z"

輸出結果:"xxxxxyyyzz"

約束條件

  • 輸入字串長度 ≤ 10⁵
  • 數字範圍為 1 ≤ 數字 ≤ 1000
  • 字元與數字的對應關係合法,無單獨數字、無連續數字等非法格式

Python 實現

def decompress_string(s: str) -> str:
    if not s:
        return ""
    
    result = []
    n = len(s)
    i = 0
    
    while i < n:
        # 提取當前字元(一定是小寫字母)
        char = s[i]
        i += 1
        # 提取連續的數字(可能多位)
        count_str = ""
        while i < n and s[i].isdigit():
            count_str += s[i]
            i += 1
        # 確定重複次數(無數字則為1)
        count = int(count_str) if count_str else 1
        # 拼接重複後的字元
        result.append(char * count)
    
    return "".join(result)

# 測試示例
print(decompress_string("a2b2c3a"))  # 輸出: aabbccca
print(decompress_string("x5y3z"))    # 輸出: xxxxxyyyzz
print(decompress_string("ab2c3d"))   # 輸出: abbccc d

解題思路

  1. 雙指標遍歷:用指標 i 遍歷字串,先提取當前字元,再提取緊跟的數字(處理多位數字情況)。
  2. 規則匹配:無數字則計數為 1,有數字則轉換為整數作為重複次數。
  3. 結果拼接:將字元按計數重複後加入結果列表,最終拼接列表得到解壓字串。
  4. 效率最佳化:使用列表儲存結果(避免字串拼接的效能損耗),單遍遍歷時間複雜度為 O(n),空間複雜度為 O(n)(儲存結果),滿足長度≤10⁵的約束要求。

寫在最後

以上就是我這次 BCG X DS OA 的真實題目分享和備戰心得。

如果你正在準備 BCG X、QuantumBlack 或其他諮詢公司的 Data Science / Analyst OA,感覺 SQL、Pandas 或時間管理方面壓力比較大,可以瞭解一下 Programhelp 的服務,支援 HackerRank、牛客網、CodeSignal 等平臺,提供 OA 代寫和輔助,確保所有測試用例透過,不透過不收費,操作也比較安全。

有需要的同學可以自己去了解一下。感謝閱讀,祝大家早日透過 OA,拿到滿意的 Offer!

author avatar
Jory Wang Amazon資深軟體開發工程師
Amazon 資深工程師,專注 基礎設施核心系統研發,在系統可擴充套件性、可靠性及成本最佳化方面具備豐富實戰經驗。 目前聚焦 FAANG SDE 面試輔導,一年內助力 30+ 位候選人成功斬獲 L5 / L6 Offer。
END
 0