BCG X OA 使用 HackerRank 平臺,時長 90 分鐘,題型構成相對固定:20–25 道 MCQ(涵蓋 SQL、Python/Pandas、基礎統計和商業邏輯) + 2 道 Coding / Data Analysis 題(一道偏業務分析,一道偏程式碼實現)。整體難度中等,但時間壓力較大,尤其需要同時兼顧準確率和編碼效率。
和傳統網際網路公司的純演算法 OA 不同,BCG X 更注重“資料 + 業務”的結合,考察你能否用資料工具快速解決實際業務問題。

題目 1:字串壓縮演算法
題目描述
為減少網際網路傳輸的訊息大小,某壓縮演算法會對字串中連續重複的字元進行編碼。
你的任務是按照以下規則壓縮給定字串:
- 從左到右掃描字串,將連續相同的字元分為一組。
- 如果某個字元僅出現一次,則直接將該字元新增到輸出結果中。
- 如果某個字元連續出現多次,則將字元和它的連續出現次數拼接後,新增到輸出結果中。
示例:
輸入字串 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 pod_id"→ 向該 Pod 傳送資料,返回最終寫入資料的 Pod ID(或 – 1)。 - 資料庫連線失效查詢:
"2 pod_id"→ 標記該 Pod 為失效狀態。
返回一個陣列,包含所有資料傳送查詢的結果。
示例:
n = 3m = 2connections = [[1, 2], [2, 3]]queries = [[2, 2], [1, 2], [2, 1], [2, 3], [1, 1]]
過程:
- Pod 2 失效。
- 向 Pod 2 傳送資料,轉發到區域內 ID 最小的正常 Pod(1),結果為 1。
- Pod 1 失效。
- Pod 3 失效。
- 向 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 取模。
示例 1:n = 3
節點間共有 C(3,2) = 3 條可能的邊,每條邊可選 / 不選,總共有 2³ = 8 種不同構型,因此返回 8。
示例 2:n = 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 次,直接保留到輸出結果中。
- 若字元後有數字,說明該字元連續出現該數字次,將字元重複對應次數後拼接至輸出結果中。
- 輸入字串僅包含小寫字母
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
解題思路
- 雙指標遍歷:用指標
i遍歷字串,先提取當前字元,再提取緊跟的數字(處理多位數字情況)。 - 規則匹配:無數字則計數為 1,有數字則轉換為整數作為重複次數。
- 結果拼接:將字元按計數重複後加入結果列表,最終拼接列表得到解壓字串。
- 效率最佳化:使用列表儲存結果(避免字串拼接的效能損耗),單遍遍歷時間複雜度為 O(n),空間複雜度為 O(n)(儲存結果),滿足長度≤10⁵的約束要求。
寫在最後
以上就是我這次 BCG X DS OA 的真實題目分享和備戰心得。
如果你正在準備 BCG X、QuantumBlack 或其他諮詢公司的 Data Science / Analyst OA,感覺 SQL、Pandas 或時間管理方面壓力比較大,可以瞭解一下 Programhelp 的服務,支援 HackerRank、牛客網、CodeSignal 等平臺,提供 OA 代寫和輔助,確保所有測試用例透過,不透過不收費,操作也比較安全。
有需要的同學可以自己去了解一下。感謝閱讀,祝大家早日透過 OA,拿到滿意的 Offer!