
最近 Microsoft 26 summer SWE OA 算是顺利拿下了,hackerrank 两道题写的快的话30分钟以内可以做完,这段时间的OA / VO 的也挺集中,像 TikTok、Amazon、Meta、Adobe 都在陆续推进。 微软OA 整体不偏门,语言不限,Python / C++ / Java 都可以。
Microsoft OA Q1
题目:给定一个字符串 s,要求枚举该字符串的所有连续子串,将这些子串按字典序排序,并返回排在字典序最大的那个子串,子串是连续的,字符范围为 a–z,字符串长度不超过 100,这题本质是在所有子串中找出字典序最大的结果。
思路:所有子串里字典序最大的,一定等价于“所有后缀里字典序最大的”,因为任意子串都是某个后缀的前缀。用双指针比较两个后缀,从左到右淘汰较小的起点,最终留下的起点就是最大后缀的起点。
代码:
def maxSubstring(s):
n = len(s)
i = 0
j = 1
k = 0
while j + k < n:
if s[i + k] == s[j + k]:
k += 1
elif s[i + k] < s[j + k]:
i = j
j = i + 1
k = 0
else:
j = j + k + 1
k = 0
if j == i:
j += 1
return s[i:]Microsoft OA Q2
题目:给你一个长度为 的排列 (包含 1~且各不相同),定义一个数 是 balanced:如果存在一段连续子数组区间 ,使得子数组 恰好由数字 组成(顺序任意、每个出现一次,即是 的一个排列)。要求对每个 判断是否 balanced,并返回一个长度为 的二进制字符串:第 位为 '1' 表示 balanced,否则为 '0'。
思路:我们先把每个数字的位置记下来,用一个数组 pos[val] = index,这样能 O(1) 找到值 k 在哪,之后从 k = 1 开始往上扫,把目前 1..k 这些数出现过的最小下标 l 和最大下标 r 维护起来,如果当前这段区间长度 r - l + 1 正好等于 k,说明 1..k 这 k 个数正好连续出现,是一个排列,就记 1,否则记 0
代码:
def countBalancedNumbers(p):
n = len(p)
pos = [0] * (n + 1)
for i, val in enumerate(p):
pos[val] = i
l = pos[1]
r = pos[1]
ans = []
for k in range(1, n + 1):
if k > 1:
idx = pos[k]
if idx < l:
l = idx
if idx > r:
r = idx
if r - l + 1 == k:
ans.append('1')
else:
ans.append('0')
return ''.join(ans)准备小结
如果你也在准备 微软 Intern 或其他大厂的 OA/VO,可以直接联系 interviewAid 了解对应的面试辅助和陪跑支持。如果你想找我辅助面试,或者用 Microsoft intern面经 中的原题 mock,感受最真实的feedback,欢迎戳我。
全网唯一一家支持 L6 以上 system design mock,只放真实面经。
求职辅助服务,是关于时间和品质的较量。咨询interviewAid,获取最专业的Tech求职辅助。