前几天做了 IBM OA ,两道题都不算难,但很考察有没有想到更简洁的方案。我最开始对第一题用了 Set 来追踪重复,结果代码冗长还容易出错;后来改成位掩码才发现原来这么简单。这就是 IBM OA 的风格——没有高难度算法来为难你,而是看你能不能用最直接的方式把问题解决好。下面把两题的完整思路和几个容易踩的坑都写出来。

题 1:最少无重复字符分段

题意
把字符串切成尽可能少的连续非空段,每段内部字符互不重复,每个字符恰好属于一段,求最少能切成几段。
示例:”abcc” → 2(切成 “abc” | “c”);”abdaa” → 3。字符串长度最大 2×10⁵,只有小写字母。
思路
字符集只有 26 个,直接用一个 int 当位掩码标记当前段已出现的字符,不需要开哈希表。
从左到右扫:如果当前字符在掩码里已经出现,说明这一段得结束了——段数加一、清空掩码、把当前字符放进新段;否则把当前字符标记进掩码继续走。结果初值设为 1(整串无重复时就只有一段)。
O(n) 时间、O(1) 空间,一次遍历搞定。
边界注意:空串和单字符都应该返回正确值,初始化的时候别漏。
题 2:有序时间戳上的最大窗口请求数

题意
给一个已按非降序排好的时间戳数组,以及窗口长度 window,求任意闭区间 [x, x+window-1] 内最多能覆盖多少个时间戳。
示例:window=5,timestamps=[1,2,3,8,10],答案 3(窗口 [0,4] 覆盖 1、2、3)。
约束:n ≤ 2×10⁵,window 可达 10⁹。
思路
标准双指针滑动窗口。右指针 i 右移扩大窗口,当 timestamps[i] – timestamps[j] + 1 > window 时左指针 j 右移收缩,保持窗口合法。每步记录当前窗口大小 i-j+1,全程取最大值。
数组已有序,一次扫描 O(n),不需要排序。
边界注意:window 很大时整段都合法,别被大数字吓到,逻辑没变化。
FAQ
Q:这两题难度大概什么水平?
都是 Easy 到 Medium 下半部分。算法本身没什么难度,关键是想清楚状态转移或者边界条件。
Q:IBM OA 一般几道题,时间多久?
通常 2-3 道,90 分钟。这两道题加起来用了大概 20-25 分钟,剩下时间看第三题或者检查。
Q:位掩码在实际工作中用得多吗?
在算法题里用得多,实际工程里除非是性能极限的情况,一般用 Set/BitSet 这类库会更清晰。但理解位掩码的原理对优化思维有帮助。
Q:有没有第三题的信息?
没遇到第三题,或者没时间做。不过根据面经,IBM 的第三题通常是中等难度的动态规划或者图论,准备的时候可以按这个方向来。
Q:IBM OA 通过之后流程怎么走?
OA 过了基本一周左右会约 phone screen。整个周期从投递到拿结果大概 3-4 周,IBM 的节奏相对快。
Q:Python 和 Java 哪个更吃香?
IBM 两种都接受。Python 代码更简洁,适合快速想清楚思路;Java 如果对库很熟悉也很快。关键是思路对、实现稳定。
Q:做 IBM OA 需要特别准备什么?
SQL 和编程都考,建议两块都刷一遍。算法题按 LeetCode 的常见标签(数组、字符串、双指针、动态规划)复习就够了,IBM 不考特别偏门的数据结构。
最后
IBM 的 OA 体验比我预期要好——题目清晰、不会因为难度而卡人,反而会因为”有没有想到更优雅的解法”而分出档次。
两道题的共同点是都没有复杂的前置知识要求,只要你写过基础的数据结构和算法,15-20 分钟能一次过。这对求职者来说反而是好事——你可以把精力放在”想清楚、写对”而不是”怎么优化到极限”。
如果也在准备 IBM 或者其他公司的 OA,建议先过一遍 LeetCode 的常见题(尤其是 Easy 和 Medium),然后时不时做做整点的真题模拟。Interview Show 专注北美大厂的面试辅助,团队来自 Google、Meta、Anthropic 等一线公司,对每家的真实考察方向都很熟。