在准备 microsoft oa questions 的过程中,很多同学都会有一个错觉:题目看起来不难,但真正写起来,要么边界条件通不过,要么在隐藏用例上翻车。
这次 26 届 Microsoft OA 非常典型——两道题都不是“难算法”,但都强烈考察你是否理解题目、是否能快速给出思路。下面按真实做题体验,完整拆解时间线、真题思路和常见误区,给正在刷 Microsoft OA 的同学一个更接近实战的参考。
Microsoft 面试时间线
投递后约 1–2 周收到 OA
10/3 收到oa
10/16 收到final round
10/26 final round三轮
11/8 recruiter发邮件说large volume of recruiting
11/21 action center complete
12/11 offer
Microsoft OA 真题分享
第一题:最大化数组的 MEX
给定一个整数数组,你可以对任意元素进行操作,把它减少到区间 [0, 原值] 内的任意整数。目标是通过调整数组,使整个数组的 MEX(最小缺失非负整数)最大化,返回这个最大 MEX。
要求
- 想要 MEX = m,数组中必须至少各有一个 0,1,2,…,m-1
- 每个数只能被“减小”,不能变大
- 所以大数可以“填坑”,小数如果太小就没救了
贪心思路
- 先将数组从小到大排序
- 维护一个当前“需要凑出来”的数 x,初始为 0
- 从左到右遍历排序后的数组:
- 如果当前元素 ≥ x,说明可以把它减成 x,用来“占坑”
- 成功占坑后,x++,继续找下一个
- 如果当前元素 < x,说明这个数已经帮不上忙,直接跳过
- 遍历结束后,当前的 x 就是能得到的最大 MEX
第二题:字符串滚动加密(Roll 操作)
给定字符串 s,以及一个数组 roll。每个 roll[i] 表示:对 s 的前 roll[i] 个字符都做一次字母循环 +1(a→b,…,z→a)。按顺序执行所有 roll[i],输出最终字符串。
暴力解法
- 如果每次 roll[i] 都真的去改前 roll[i] 个字符
- 最坏情况是 O(n²),一定会 TLE
优化思路是使用差分数组:
- 不关心“哪一次操作”,只关心“每个位置总共被加了几次”
- 用差分数组记录区间加法
具体做法
- 初始化一个长度为 n 的差分数组 diff,全 0
- 对每个 roll[i]:
- diff[0] += 1
- 如果 roll[i] < n,则 diff[roll[i]] -= 1
- 对 diff 做前缀和,得到每个位置被加的总次数 cnt[i]
- 对每个字符 s[i]:
- 计算 (s[i] – ‘a’ + cnt[i]) % 26
- 再转回字符
时间复杂度是O(n + m),空间复杂度 O(n)。
FAQ-Microsoft OA Questions
Q1:微软 OA 更看重算法还是实现?
A:两者都看。第一题偏思路正确性,第二题明显在考你是否熟悉差分 / 前缀和这种工程里常用的优化技巧。
Q2:这套题 LeetCode 刷题量多少能稳?
A:题目本身不难,但如果没见过 MEX 贪心或区间差分,很容易在 OA 里临时想不出来。刷题之外,更重要的是总结“题型模板”。
Q3:Python 会不会吃亏?
A:不会,只要思路对、复杂度稳,Python 完全够用。真正吃亏的是写了暴力还没意识到。
为什么 Microsoft OA 真正拉开差距的不是“难题”
整体来看,这次 Microsoft OA 更像是在筛“基础是否扎实、思路是否清晰”的候选人,而不是拼偏难怪题。如果你经常在 OA 里卡在思路拐点、或者知道方向但临场实现不稳,其实提前把高频模型吃透,或者在关键节点有人帮你校正方向,差别会非常明显。
如果你发现自己经常在 OA 或技术面里出现这些情况——
- 大方向对,但细节越写越乱
- 知道用什么算法,却总是差一步
- 面试现场容易紧张,发挥明显低于平时
那提前把高频题型和常见解法真正“吃透”,或者在关键节点有人帮你校正方向,带来的提升会非常明显。
如果你后续还计划冲 Microsoft 或其他北美大厂的 OA / 技术面,我们这边也长期提供 OA 辅助 、VO 辅助、面试答疑等支持,从思路拆解到实现细节,都是亲力亲为,更多是帮你把临场不稳定的问题降到最低。