фон
Сегодня я столкнулся с немного интересной проблемой. Позвольте мне записать ее. Конечно, это не очень сложное требование, а решение очень простое и грубое. Конечно, если у вас есть идеи получше, добро пожаловать в комментарии и обмен.
Предположим, у нас есть массив объектов, в котором хранится время, время начала и время окончания, как показано ниже.
var arr = [
{
start:"08:00",
end:"08:30"
},
{
start:"08:30",
end:"09:00"
},
{
start:"09:00",
end:"09:30"
}
];
Длина массива неизвестна, но время начала каждого элемента меньше или равно времени окончания. Нам нужно судить, есть ли пересечение времени в этом массиве?
Позвольте мне кратко рассказать о моих размышлениях, прежде всего о том, как судить о том, есть ли пересечение между двумя временами, и в каких ситуациях есть пересечение. Как показано ниже.
Он, вероятно, включает в себя эти четыре ситуации. Тогда есть два случая, когда нет пересечения.
Следовательно, мы можем получить пересечение, посчитав, что пересечения нет, и отрицая его. Код относительно прост в реализации, поэтому я пишу здесь немного.
Нам нужно только решить, что время окончания в первый раз меньше или равно времени начала во второй раз или время начала во второй раз больше или равно времени окончания в первый раз.
checkTimes() {
//简单点,双重循环,判断每一个时间和其他任意一个时间有没有交集
for (let i = 0; i < this.arr.length; i++) {
let start1 = new Date("2022-05-19 " + this.arr[i].start);
let end1 = new Date("2022-05-19 " + this.arr[i].end);
for (let j = i+1; j < this.arr.length; j++) {
let start2 = new Date("2022-05-19 " + this.arr[j].start);
let end2 = new Date("2022-05-19 " + this.arr[j].end);
//交集判断情况较多,我们采用非交集取反的方式,
//非交集有两种情况,12AB AB12
//即1结束时间小于等于2开始时间或者1开始时间大于等于2结束时间
if (!(end1 <= start2 || start1 >= end2)) {
return false;
}
}
}
return true;
},
удачного дня.