在科技行業競爭越來越激烈的當下, IBM OA 依然保持著一貫風格:題目不偏,但對基礎能力要求極高。我們把近幾年 IBM 高頻出現的 6 類演算法題系統梳理一遍。把每一題背後的思維路徑講清楚,讓你在考場上能做到:看到題型 → 快速定位解法 → 穩定寫出程式碼。

題目 1:最多不重疊時間區間
描述:給定兩個長度為 n 的陣列 startTime 和 endTime,每個區間為左閉右開 [startTime[i], endTime[i])。求最多能選擇多少個互不重疊的區間。
樣例:
- n=3, start=[1,1,2], end=[3,2,4] → 輸出 2(選 [1,2) 和 [2,4))
約束:n ≤ 10⁵,時間 1~10⁹
思路:經典活動選擇問題。按結束時間排序,貪心選擇當前最早結束且不與已選衝突的區間。
程式碼(Python):
def maxNonOverlapping(start, end):
intervals = sorted(zip(start, end), key=lambda x: x[1])
count = 0
last_end = -float('inf')
for s, e in intervals:
if s >= last_end:
count += 1
last_end = e
return count
時間複雜度:O(n log n)
題目 2:股票最大漲幅差(單次買賣最大利潤變種)
描述:給定整數陣列,找到 i < j 且 arr[i] < arr[j] 時,arr[j] – arr[i] 的最大值。若不存在,返回 -1。
樣例:
- [5,3,6,7,4] → 4(7-3)
- [4,3,2,1] → -1
約束:n ≤ 2×10⁵,元素 ±10⁶
思路:一次遍歷,維護歷史最小值,更新最大差值。
程式碼:
def maxProfit(arr):
if not arr:
return -1
min_price = arr[0]
max_diff = -1
for price in arr[1:]:
if price > min_price:
max_diff = max(max_diff, price - min_price)
min_price = min(min_price, price)
return max_diff
時間複雜度:O(n)
題目 3:n 個頂點構圖總數(快速冪)
描述:n 個頂點(labeled),構造無向簡單圖(無自環、無重邊,可不連通)。每對頂點可連邊或不連邊,求總方案數,對 10⁹+7 取模。
樣例:
- n=2 → 2
- n=4 → 64
思路:可能邊數為 C(n,2) = n(n-1)/2,每條邊 2 種選擇 → 答案為 2^{n(n-1)/2} % MOD。n ≤ 10⁹,必須用快速冪。
程式碼:
MOD = 10**9 + 7
def countGraphs(n):
if n == 1:
return 1
exp = n * (n - 1) // 2
# pow(base, exp, mod)
return pow(2, exp, MOD)
時間複雜度:O(log (n²))
題目 4:合法三元組計數
描述:給定互不相同的整數陣列 d 和閾值 t,統計滿足 d[a] < d[b] < d[c] 且 d[a]+d[b]+d[c] <= t 的三元組 (a,b,c) 個數(下標不要求順序,只看值)。
樣例:d=[1,2,3,4,5], t=8 → 4(1+2+3=6, 1+2+4=7, 1+2+5=8, 1+3+4=8)
約束:n ≤ 10⁴,d[i] < 10⁹,t < 3×10⁹
思路:先排序(O(n log n))。固定 i < j,雙指標找最大的 k 滿足 d[i]+d[j]+d[k] d[j]。
程式碼:
def countTriplets(d, t):
d = sorted(d)
n = len(d)
count = 0
for i in range(n-2):
j = i + 1
k = n - 1
while j < k:
if d[i] + d[j] + d[k] <= t:
# 從 j+1 到 k 都滿足(已排序)
count += k - j
j += 1
else:
k -= 1
return count
時間複雜度:O(n²)
題目 5:最大技能團隊人數(滑動視窗 + 雙端佇列)
描述:給定技能陣列,選最長子陣列,使得陣列中最大值 – 最小值 ≤ 限定差值(題目中未明確寫限定值,常見為給定 limit)。
樣例:[4,13,2,3] → 3([4,2,3] 或類似,假設 limit 足夠)
約束:n ≤ 10⁵
思路:滑動視窗 + 雙端佇列維護視窗內最大值和最小值。視窗不滿足時左端右移。
程式碼框架(假設有 limit 引數):
from collections import deque
def maxTeamSize(skills, limit):
n = len(skills)
left = 0
maxq = deque()
minq = deque()
ans = 0
for right in range(n):
# 維護最大值佇列(遞減)
while maxq and skills[maxq[-1]] = skills[right]:
minq.pop()
minq.append(right)
# 收縮視窗
while skills[maxq[0]] - skills[minq[0]] > limit:
left += 1
if maxq[0] < left: maxq.popleft()
if minq[0] < left: minq.popleft()
ans = max(ans, right - left + 1)
return ans
時間複雜度:O(n)
題目 6:任務字典序最小重排(奇偶任務可互換)
描述:任務優先順序為個位數。奇數=CPU 任務,偶數=IO 任務。只能交換相鄰一奇一偶的任務。求可達到的字典序最小的優先順序序列。
核心:同奇(或同偶)任務的相對順序不可改變;奇偶任務可任意穿插(因為可自由交換)。
思路:分別提取奇數序列和偶數序列(保持原相對順序),然後像歸併一樣貪心合併,得到字典序最小的交錯序列。
程式碼:
def minLexReorder(tasks):
odds = [x for x in tasks if x % 2 == 1]
evens = [x for x in tasks if x % 2 == 0]
i = j = 0
result = []
while i < len(odds) or j < len(evens):
if i == len(odds):
result.append(evens[j])
j += 1
elif j == len(evens):
result.append(odds[i])
i += 1
elif odds[i] < evens[j]:
result.append(odds[i])
i += 1
else:
result.append(evens[j])
j += 1
return result
寫在最後
以上 6 道題目是 IBM 面試中反覆出現的高頻真題,掌握它們能顯著提升透過率。演算法面試的核心在於理解本質而非死記硬背,建議大家在練習時注重時間複雜度和邊界條件處理。如果你希望獲得更多 IBM 真題解析、Java/C++ 版本程式碼、實時面試助攻,或針對性刷題計劃,歡迎聯絡 ProgramHelp!
ProgramHelp 專注於大廠演算法面試輔導,累計幫助數千名同學成功拿到包括 IBM、Google、等 FAANG offer。我們提供:
- 最新大廠真題整理與影片講解
- 個性化刷題路線規劃
- 模擬面試與程式碼 Review
- OA無痕助攻
- VO實時輔助