刚做完最新一场 Microsoft OA ,整体难度不大,test case 全过。最近 TikTok、Amazon、高盛、Google、JP Morgan 的题也在帮同学过,手感还在,趁热把这两道核心解法记一下。

第一题:字符串 Roll 操作

题意
一次 roll:把英文字母按环形 +1(a→b,……,z→a)。给定字符串 s 和数组 roll,对每个 roll[i],把 s 的前 roll[i] 个字符各做一次 roll。返回最终字符串。
示例:s = “abz”,roll = [3,2,1]先全长 +1 得 “bca”,再前 2 位 +1 得 “cda”,再前 1 位 +1 得 “dda”。
思路
数据量不大的情况下直接模拟:对每个 roll[i],把下标 0 到 roll[i]-1 的字符 +1,z 用模 26 回到 a。字符操作写法用 (c - 'a' + 1) % 26 + 'a' 最稳,不容易出边界错误。
如果 roll 很长、串也不短,逐次改会慢,可以先用差分数组统计每个位置被 roll 的总次数,再一次性加到每个字符上,复杂度降到 O(n + m)。题面数据不大的话直接模拟也能过,不用过度设计。
第二题:至少 k 个不同整数的最短子数组

题意
正整数数组 arr 和整数 k。子数组”好”当且仅当其中至少有 k 个不同整数。求最短好子数组的长度,不存在返回 -1。
示例:arr = [2,2,1,1,3],k = 3 → 最短长度 4([2,1,1,3] 或整段)。
思路
滑动窗口:右指针向右扩展,用哈希表统计窗口内各数出现次数和不同数的个数。当不同数 ≥ k 时,收缩左指针,尽量缩短窗口,并更新最小长度。扫完若从未满足则返回 -1。
左指针移动时,某个数的次数减到 0 要把它从”不同数”里减掉,这个细节容易漏。
边界要覆盖:k = 1、数组全是同一个数、k 大于整个数组中不同数的个数。时间 O(n),空间 O(不同数个数)。
Microsoft OA 心得体会
两题都偏实现,读清题、边界写对就能过。
第一题的差分优化思路在面试官追问”如果数据量更大怎么做”时很有用,提前想好。第二题的滑动窗口模板熟了之后基本是秒题,但”次数减到 0 要从不同数里扣掉”这个细节每次都要盯住。
微软 OA 和 HackerRank/CodeSignal 风格接近,字符串模拟加滑动窗口是高频方向,练熟了这两类进去会很省时间。
FAQ
微软 OA 用什么平台,多长时间?
HackerRank 平台,通常 60 到 90 分钟,两到三道题,具体看岗位和批次。
微软 OA 难度大概什么水平?
整体偏 LC Medium,不会出很偏的算法题,更看重你能不能把规则读清楚、边界写对。字符串模拟、滑动窗口、哈希表这几类是高频方向,提前练熟比临场现推稳很多。
差分数组优化什么时候需要用?
如果 roll 数组很长(比如 10⁵ 量级)同时字符串也不短,直接模拟每次都改一遍是 O(n × m),数据量大了会超时。差分数组的做法是先统计每个位置被 roll 的总次数,最后一次性加上去,复杂度降到 O(n + m)。题面数据不大的话直接模拟也能过,不用强行优化。
滑动窗口那道题最容易错在哪?
左指针移动时,某个数的出现次数减到 0,这个数要从”不同数计数”里减掉——如果漏了这步,不同数的个数会偏多,导致窗口收缩过度,最终答案偏小。另外 k 大于整个数组中不同数个数的情况要提前判断,直接返回 -1。
微软 OA 通过率大概多少,难度有没有在变?
社区反馈通过率在 30% 到 50% 左右,难度相对稳定,不像部分公司近年在提高 OA 难度。微软更看重代码是否完整、边界是否覆盖,而不是追求极难的算法题。
OA 过了之后流程是什么?
OA 通过后通常会有一轮 recruiter 电话确认背景,然后安排技术面(Phone Screen 或直接 VO),具体轮次和流程看岗位级别,NG 一般是三到四轮。
InterviewShow整理了各厂高频 OA 题型,按目标公司给针对性刷题清单,一对一跟着走。有需要的来聊。