IBM 的 OA 用的是 HackerRank 平台,整體難度比一些大廠要友好——通常給一個小時、兩道題,準備過 LeetCode Medium 水平的同學基本綽綽有餘。但「簡單」不等於「隨便過」:題目描述喜歡用業務場景包裝,讀題不仔細照樣會翻車。
這篇把兩道高頻真題完整拆開:一道是陣列遍歷 + 平均值判斷,一道是圖連通性 + 並查集,都給出可直接提交的 Python 解法和複雜度。
IBM OA 基本情況
| 項目 | 說明 |
|---|---|
| 平台 | HackerRank |
| 題目數量 | 2 題 |
| 時長 | 60 分鐘 |
| 難度 | 基礎到中等(陣列模擬 / 前綴和 / 並查集 / 圖論) |
| 通過線 | 兩題盡量全 AC,時間通常很寬裕 |
實測兩題加起來 20 分鐘內可以做完,剩下時間足夠反覆檢查隱藏用例邊界。
Question 1: High Load Timestamps(高負載時間戳)
題目要求
給定陣列
load[n],表示各時間戳的伺服器負載。找出所有下標i(0-based),使得load[i] > 2 × 平均負載,按升序返回。若沒有,返回空陣列。
範例
n = 3
load = [1, 2, 9]
average = (1 + 2 + 9) / 3 = 4
2 × average = 8
只有 load[2] = 9 > 8
答案 = [2]
思路
先求總和再求平均,然後遍歷一遍判斷 load[i] > 2 × average。注意為了避免浮點誤差,把「除法」改成「乘法」比較:load[i] * n > 2 * total。
def get_high_load_timestamps(load):
n = len(load)
total = sum(load)
# load[i] > 2 * (total / n) 等價於 load[i] * n > 2 * total
return [i for i in range(n) if load[i] * n > 2 * total]
時間複雜度:O(n),一次求和 + 一次遍歷。 踩坑點:
- 用整數乘法替代浮點除法,避免
2 × average在邊界上的精度問題 - 題目要的是下標升序,不是值;遍歷天然升序,無需額外排序
- 空陣列 / 全相等陣列要返回空結果,別漏掉
Question 2: Minimum Reassignments for Connectivity(連通性最小重連數)
題目要求
管理
link_nodes個分散式程式碼倉庫,部分倉庫已透過直接版本連結同步。可以執行任意次「重連」:拆掉一條已有連結,把它接到任意另一對倉庫上。求讓所有倉庫連成一個同步系統所需的最少重連次數;若不可能,返回 -1。
範例
link_nodes = 4
link_from = [1, 1, 3]
link_to = [2, 3, 4]
思路
這是經典圖連通性題:
- 一個含
n個節點的連通圖至少需要n - 1條邊。如果現有邊數< n - 1,無論怎麼重連都連不起來,直接返回 -1。 - 否則用並查集統計當前有多少個連通塊
c。 - 因為允許拆已有邊重連,只要總邊數足夠,把
c個連通塊拼成 1 個需要的額外連接數就是c - 1。
def min_reassignments(link_nodes, link_from, link_to):
edges = len(link_from)
# 連通所有節點至少需要 n - 1 條邊
if edges < link_nodes - 1:
return -1
parent = list(range(link_nodes + 1)) # 1-based 節點
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]] # 路徑壓縮
x = parent[x]
return x
def union(a, b):
ra, rb = find(a), find(b)
if ra != rb:
parent[ra] = rb
for a, b in zip(link_from, link_to):
union(a, b)
# 統計連通塊數量(只數 1..link_nodes)
components = len({find(i) for i in range(1, link_nodes + 1)})
return components - 1
時間複雜度:O(E · α(N)),並查集近似線性。 踩坑點:
- 邊數不足時必須先返回 -1,否則後面的
c - 1會給出錯誤答案 - 節點編號是否 1-based 要看清;上面按 1-based 處理,0-based 改
range(0, link_nodes)即可 - 自環 / 重複邊不影響連通塊計數,並查集天然去重
備考題型清單
| 題型 | 出現頻率 | 代表技巧 |
|---|---|---|
| 陣列模擬 / 平均值判斷 | 高 | 整數乘法替代浮點 |
| 前綴和 / 滑動視窗 | 中 | 區間和 O(1) 查詢 |
| 並查集 / 圖連通性 | 高 | 路徑壓縮 + 連通塊計數 |
| 字串處理 | 中 | 計數 / 雜湊分組 |
FAQ
Q1:IBM OA 的題型難度大嗎? 不算大,整體偏基礎,考的都是常見演算法和圖論思路。刷過 LeetCode Medium 水平就能輕鬆應對。
Q2:OA 平台是哪個? HackerRank,介面和操作跟常見 OA 平台差不多,提前熟悉提交流程即可。
Q3:一小時兩題夠用嗎? 絕對夠用。兩題熟練的話 20 分鐘內可以做完,剩下時間反覆檢查隱藏用例。
Q4:需要提前刷哪些題? 重點準備陣列模擬、前綴和、並查集、圖連通性。IBM OA 主要看基礎演算法能力,不會太花俏。
Q5:用什麼語言? HackerRank 支援主流語言,Python / Java / C++ 都行,按最熟的來;並查集用 Python 寫最快。
正在準備 IBM OA?
IBM OA 雖然偏基礎,但讀題不細、並查集邊界沒處理好同樣會丟分。需要針對性的題型梳理和限時 mock,歡迎聯絡下方方式取得真題與備戰計畫。
聯絡方式
需要面試真題與客製化備戰計畫?立刻聯絡微信 Coding0201,取得真題。
Email: [email protected] Telegram: @OAVOProxy