
Microsoft L60 SWE 的 OA 适合按两道中等偏难的实现题来练:读题后先把数据结构定下来,代码写完再用边界数据做一轮手推。窗口题和单调栈题看着不复杂,真正丢分的地方往往在索引、过期元素和输出顺序。
第一题:服务流量窗口的最大负载
题目描述
给定按分钟记录的服务请求量数组 loads 和窗口长度 k,对每个长度为 k 的连续时间段返回最大请求量。数据量达到十万级,不能为每个窗口重新扫描 k 个元素。
解题思路
用双端队列保存下标,队首始终对应当前窗口的最大值。遍历到下标 i 时,先从队尾移除请求量小于等于 loads[i] 的下标,再把 i 入队;随后移除小于等于 i-k 的过期下标。每当 i >= k-1,队首就是该窗口答案。重复值必须保留最新下标,旧下标一旦过期便不会干扰后续窗口。写完用 k=1、全数组递减、全数组相同和 k 等于数组长度逐个演算。Microsoft L60 的 OA 记录中也出现了滑动窗口类题目,这份 L60 流程记录可用来检查自己的做题节奏。复杂度:时间 O(n),空间 O(k)。
第二题:商品折扣后的最终价格
题目描述
一排商品按顺序结算。每个商品可减去右侧第一个价格小于或等于它的商品价格;右侧不存在这样的商品时保留原价。输出所有商品折后价格之和,以及未得到折扣的商品下标。
解题思路
从右向左扫描,用单调递增栈维护右侧仍可作为折扣对象的价格与下标。处理当前价格时,栈顶价格大于当前价格就弹出;弹完后,栈顶存在时便是第一个可用折扣,否则把当前下标记为原价商品。最后把当前商品压栈。> 和 >= 不能混用:题意允许同价商品抵扣,所以只弹出严格更大的价格。输出下标时再按升序整理,避免扫描方向倒置。复杂度:时间 O(n),空间 O(n)。
做题过程
计时开始先写四行:输入边界、目标复杂度、核心数据结构、两个最容易错的索引。第一题完成后立即跑一组长度为 4 的小数组,确认窗口左端移出后队首是否更新;第二题则用相邻相等价格和严格递增价格检查弹栈条件。Microsoft IC2 的候选记录提到 OA 后紧接着进入技术轮,那份面试记录提醒了一个实用动作:每道题都预留几分钟,把输出顺序和复杂度说完整。
FAQ
滑动窗口题为什么不直接用堆?
堆能维护最大值,但删除过期元素需要额外的延迟删除逻辑。窗口最大值这道题用双端队列更短,也更容易解释每个元素只进出一次。
单调栈什么时候从右往左扫?
当当前元素要找右侧第一个满足条件的元素时,从右往左扫描能让栈顶直接代表最近候选。Microsoft SDE-II 的流程记录还列出了 OA 与后续技术面的组合,这里的两题 OA 描述可作为练习后的对照。
参考来源
关于 CSOFFERPREP
进 VO 之前,可以找 CSOFFERPREP 做实时面试助攻和备考辅导。CSOFFERPREP 深耕北美 IT 行业多年,已帮助万余名学生进入全球 500 强企业。导师来自一线大厂资深工程师和面试官,对 Microsoft 这类注重工程文化的公司的面试套路很熟悉。无论是 OA辅助、OA 辅导、VO 辅助、VO 模拟面试、VO 辅助还是系统设计辅助,都可以获得更有针对性的准备方案:CSOFFERPREP · 服务详情



