题目重点:按车配对生成半开会话、同时间事件批处理,区分完整日志峰值与缺失退出下的上界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 先定义时间单位,最大停留H=2小时按单位转换;会话[start,end)表示exit时已不占车位。
- 完整日志训练需要窗口起点已知occupancy、entry/exit能配对;孤立exit和重复entry进入异常清单,不能静默当完整数据。
- 漏扫exit只给最大停留时长,真实离开时间未知;用entry+H补exit得到可能占用上界,不是已知真实停满2小时。若题目要求强制按超时补exit,须由正式合同明确。
解题路线
- 事件按时间排序并按车辆ID组装会话状态。一个车先entry1、exit10、entry11意味着两次访问;只按ID去重会删真实第二次。重复扫码需要eventId/业务政策,不按同车全删。
- 在完整会话上生成start+1/end−1事件。每个时间戳先合并净变化,再把变化后的count用于[t,nextT)。这避免同一时刻一车出一车进的假峰。
- 找最大count同时记录所有持续正长度区间;相邻区间count均为最大可拼接,分离峰值要返回多个。不要把单个事件瞬间当一段占用,也不要只返回首次峰。
- 漏扫会话若entry=a且没有后续exit,真实结束≤a+H;若同车再entry=b,结束还应≤b。按min(a+H,b)作最晚结束给上界,但没有最小停留时长时正时长占用下界很弱。已观测的有效exit应保留,不能一律改成2小时。
- 原示例车2只有exit20:可能窗口前已进入,也可能entry丢失/错误事件。若只知道exit scanner有问题,不能凭空推其entry=18;需窗口初始车辆清单或说明输出只算可配对会话。
- 给调用方分开返回确证峰值、按最晚exit假设的上界和异常项。若确实要求唯一精确峰值但证据不足,应说明不可识别,并请求初始状态/补扫政策,而非输出编造时间段。
手动走一遍
完整会话[1,10)、[5,12)、[10,11)在[5,11)均为2辆,同刻10出/进不产生3辆;可合并两个相邻峰段。缺exit的entry0在最多停2小时约束下,离开10分钟与110分钟都合法,和另一车1小时进入时会产生不同真实峰值,所以仅补2小时无法恢复真值。
规模与取舍
E事件排序O(E log E),配对/聚合O(E),会话与异常O(E)空间。已排序输入可流式处理,但乱序需watermark/迟到政策,不能在收到一个exit就永久封口所有过去区间。
易错点与追问
容易失分的边界
- 忽略孤立exit假定停车场空。
- 同一ID只保留一条事件。
- 相同时间逐条处理产生假峰。
- 最多2小时写成实际2小时。
- 只返回一个峰段。
继续深挖
- 允许迟到事件怎样修订峰值?
- 进入也漏扫时还能给什么上下界?
- 初始车辆有剩余停留时长怎样建会话?
- 重复扫码如何用eventId幂等?
