CSOAHelp 学员近期参加了 Google 软件工程师现场轮(虚拟),算法题考察多参与者日历空闲槽查找。题目经典但有变体:输入为事件日志(Start/End),需找出所有 calendars 同时空闲且长度足够的槽位。我们提前通过 CSOAHelp 真题库 + mock 面试,帮助候选人掌握 sweep line + 区间合并技巧,避免现场卡壳。以下基于真实回放精炼还原(隐藏个人信息),供备战 Google 参考。
题目描述
Given k calendars, a meeting duration and bounds, return a list of possible time slots where the meeting can be scheduled.
输入(澄清后):
- timeout:会议最小持续时间(整数时间戳单位)。
- log:事件日志列表,每项 [ID, Timestamp, "Start" 或 "End"],ID 为 calendar 标识(1~k)。
- bounds:可选整体时间范围 [start, end](默认 0 到足够大)。
输出:[[start1, end1], [start2, end2], ...],所有 calendars 同时空闲且 end - start >= timeout 的槽位,按时间排序。
示例(面试中给出):
- timeout = 3
- log = [[1,0,"Start"], [2,1,"Start"], [1,2,"End"], [3,6,"Start"], [2,7,"End"], [3,8,"End"]]
- 预期:类似 [[2,6], [8,10]](需验证细节)。
澄清过程
候选人先问:
- Events per ID 是否有序、无重叠?面试官:假设输入合法,Start 先 End。
- log 是否已排序?面试官:未排序,需自己处理。
- bounds 未给?面试官:用 log 中的 min/max + 合理扩展。
- k?面试官:从 log ID 推断 max。
CSOAHelp 提示:这些问题直接问清,避免假设错误。
思路
核心:用 sweep line 扫描时间线,维护活跃会议计数(active count)。当 active == 0 时,表示所有 calendars 空闲。
步骤:
- 将 log 转为事件列表:(timestamp, delta),delta = +1 (Start) / -1 (End)。
- 按 timestamp 排序,同时间 End 先处理(-1 先 +1)。
- 扫描:记录 prev 时间点,遇到 active==0 且当前 gap >= timeout,收集槽。
- 边界处理:开头/结尾空闲段。
时间 O(N log N)(N = log 长度),空间 O(N)。
备选:先 per calendar 收集 busy intervals → merge per calendar → union 所有 busy → gaps 即 free slots。
面试官认可 sweep line,但追问 per-calendar merge 版本(更易 debug outliers)。
代码节选(关键部分)

调试时 fix 排序顺序 + 边界(max_ts 处理)。
面试官追问
- Q:log 很大(10^5+)?A:O(N log N) 够用;或 heap + merge intervals 优化。
- Q:per calendar 事件不配对/重叠?A:假设合法;可加 per-ID 校验(stack)。
- Q:duration=0?A:特殊处理,返回所有 free 点或无限。
- Q:real-world 时区/精度?A:假设统一整数时间戳。
- Q:输出所有槽还是最早一个?A:题目要 list,全返回。
面试官满意,结束时问项目。
经验分享
这题是 Google 常见变体(类似 LeetCode 1229 / calendar merge),考察事件排序 + 计数/合并。CSOAHelp 通过针对性 mock(多日历 free slot 专题)和实时代码 review,让学员从澄清到优化流畅应对。2026 年 Google 算法轮仍重基础 + 工程思考。
如果你也在冲 Google/FAANG,欢迎加入 CSOAHelp 题库群或预约 1v1 mock——我们有最新真题更新、澄清模板、代码优化指导。扫码/官网 csoahelp.com 咨询,助你高效通过!加油~
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

