
收到 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)。不要只在弹出后补判断,堆序和结果会脱节。
关于 CSINTERVIEWHELP
进 VO 之前,可以找 CSINTERVIEWHELP 做实时面试助攻和备考辅导。CSINTERVIEWHELP 深耕北美 IT 行业多年,已帮助万余名学生进入全球 500 强企业。导师来自一线大厂资深工程师和面试官,对 DoorDash 这类注重工程文化的公司的面试套路很熟悉。无论是 OA 题型解析、OA 辅导、VO 辅助、VO 模拟面试、VO 面试陪练还是系统设计辅助,都可以获得更有针对性的准备方案:CSINTERVIEWHELP · 服务详情
