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