DoorDash SWE OA 面试复盘|90 分钟两题,配送窗口和司机分配如何写
收到 DoorDash SWE OA 后,最容易卡住的不是语法,而是读完业务包装后能不能迅速抽出数据结构。90 分钟两题的节奏里,第一题把订单时间戳压进固定窗口,第二题要在司机可用状态不断变化时完成分配。 优先把输入、输出和边界写在草稿。
收到 DoorDash SWE OA 后,最容易卡住的不是语法,而是读完业务包装后能不能迅速抽出数据结构。90 分钟两题的节奏里,第一题把订单时间戳压进固定窗口,第二题要在司机可用状态不断变化时完成分配。 优先把输入、输出和边界写在草稿区。题干里出现订单、距离、可用司机,不代表要模拟整套配送系统;把状态收窄后,主逻辑会清楚很多。
第一题:固定时段内的订单峰值
题目描述
给定按时间排序的订单到达时间 t[] 和窗口大小 k ,返回任意长度为 k 的时间段内可覆盖的最大订单数。相同时间戳的订单都必须计入,窗口左右边界也要统一处理。
解题思路
双指针维护半开区间 [t[left], t[right]] 。右指针每次加入一张订单;当 t[right] - t[left] > k 时不断移动 left ,直到窗口合法。此时 right-left+1 就是当前窗口里的订单数,更新答案即可。 关键是先写清楚窗口定义。如果题目要求 k 分钟内包含端点,就用 <= k 保留元素;如果给出的是闭区间时刻,再把比较条件一起改掉。不要在循环里混用两套定义。 复杂度 :时间 O(n),空间 O(1)。
第二题:距离与可用状态的司机分配
题目描述
订单带有位置和到达时间,司机也有位置、空闲时间与距离信息。每张订单需要选出当时可用且距离最短的司机;距离相同按司机编号升序。完成一单后,司机的下一次可用时间会变化。
解题思路
按订单到达时间扫描。准备两个优先队列:一个按司机可用时间排序,另一个存当前已经可接单的司机,键为 (distance, driverId) 。处理新订单前,把 availableAt <= orderTime 的司机从等待队列转入可用队列;取出堆顶司机分配订单,再按新的可用时间放回等待队列。 如果距离取决于订单位置,候选键要把实时距离一起纳入。规模较小时可遍历空闲司机;题目给到连续订单和大量司机时,用堆保存可用集才能避免每单扫描全表。队列为空时要按题目要求返回未分配标记,别把下一位未来可用的司机提前拿来用。 复杂度 :每次入堆、出堆为 O(log m), m 为司机数。
做题过程
第一题先用两个订单、同一时间戳、恰好落在窗口边界的三组样例跑一遍。第二题再补三种状态:多个司机同距、同一司机连续接单、订单先到但全部司机尚未空闲。时间紧时,先让主流程可运行,再补 tie-breaker 和空结果分支。 DoorDash 的题目常把数组题放进配送语境。把“订单流”翻译成排序数组,把“可用司机”翻译成候选集合,题目就回到了滑动窗口和优先队列。对完整流程有兴趣,可以看看 DoorDash 候选人整理的技术面经验 ,再用自己的语言复述状态如何流动。
FAQ
DoorDash OA 的滑动窗口题先写二分还是双指针?
时间戳已排序、窗口只向前推进时,双指针更直接,也更容易控制边界。只有查询彼此独立、需要反复定位区间时,二分才更合适。
司机分配题怎样处理距离相同?
把 tie-breaker 放进堆键,例如 (distance, driverId) 。不要只在弹出后补判断,堆序和结果会脱节。
联系 VOPathway
如果你希望把这套方法用于自己的 OA 或 VO 准备,可以把目标岗位、当前阶段、面试时间和主要难点发给 VOPathway,我们会据此安排针对性的练习与复盘。
- 微信:Coding0201
- 邮箱:[email protected]
- Telegram:@OAVOProxy
- WhatsApp:+86 178 6396 8105
可提供 OA辅助、OA辅导、VO辅助与 VO辅导。文章用于训练参考,不代表相关公司的官方流程;实际安排请以候选人收到的通知为准。
本文用于面试准备与训练复盘。公司名称仅用于标识题型素材主题,不代表官方合作或录用承诺。
预约一次训练复盘 ↗