JavaScript实现时间区间重叠检测的最优方案
检查时间槽冲突的最优实现方案
首先明确时间冲突的判断逻辑:两个时间槽不存在冲突的唯一情况是其中一个完全在另一个的结束时间之后,或者完全在另一个的开始时间之前。反过来,只要不满足这个条件,就说明两个时间槽存在重叠/冲突。
为了高效比较,我们可以先把时间字符串(如"13:00")转换成当天的总分钟数,用数字对比会比字符串直接判断更高效直观。
具体实现步骤
- 写一个辅助函数,将"HH:MM"格式的时间字符串转换为分钟数
- 遍历现有时间槽数组,逐个和用户提交的时间槽做冲突判断
- 只要发现任意一个冲突,立刻终止遍历并返回冲突结果;若遍历完所有槽都无冲突,就可以安全添加新时间槽
代码示例
// 辅助函数:把HH:MM格式的时间转成当天总分钟数 function convertToMinutes(timeStr) { const [hours, minutes] = timeStr.split(':').map(Number); return hours * 60 + minutes; } // 检查是否存在时间冲突 function hasTimeConflict(existingSlots, newSlot) { const newStart = convertToMinutes(newSlot.startTime); const newEnd = convertToMinutes(newSlot.endTime); // 遍历现有槽,发现冲突立即返回true for (const slot of existingSlots) { const start = convertToMinutes(slot.startTime); const end = convertToMinutes(slot.endTime); // 冲突判断:新槽和当前槽既不是完全在前也不是完全在后 if (!(newEnd <= start || newStart >= end)) { return true; } } return false; } // 测试用例 const existingSlots = [ { startTime: "13:00", endTime: "15:00" }, { startTime: "17:00", endTime: "20:00" } ]; const newSlot = { startTime: '16:00', endTime: '18:00' }; console.log(hasTimeConflict(existingSlots, newSlot)); // 输出true,和17:00-20:00存在重叠
为什么这是最优实现?
- 时间复杂度低:遍历数组是O(n)(n为现有时间槽数量),每个比较都是常数时间,线性复杂度在绝大多数场景下足够高效
- 逻辑清晰:转成分钟数避免了字符串比较的潜在问题,冲突判断条件简洁直白,不容易出错
- 提前终止:一旦发现冲突就停止遍历,不用检查剩余槽,减少不必要的计算
内容的提问来源于stack exchange,提问作者vaibhav deep
相关产品推荐
相关产品推荐

