在数组中查找两次之间的最短差



我有以下strArr数组

["下午1:10","凌晨4:40","下午5:00"]

现在,我正试图找到上述时间列表中以分钟为单位的最短时间差。

在上面的数组中,它应该超过我230。

所有时间都是十二小时制。(HH:MM(上午/下午((

function TimeDifference(strArr) { 
// code goes here  
return strArr; 
}

// keep this function call here 
console.log(TimeDifference(readline()));

好吧,因为你需要以分钟为单位的结果,首先我会将所有值转换为分钟:

strArr.map((time) => /(d{1,2}):(d{1,2})(am|pm)/.exec(time).slice(1))
.map(([hour, min, midday]) =>
(Number(hour) + (midday === `pm` ? 12 : 0)) * 60 + Number(min))

然后我会把它从最小到最大排序,这样我们就可以比较n(I(和n(I+1(:

.sort((a, b) => (a > b ? 1 : a < b ? -1 : 0))

在我们以分钟为单位对时间进行排序后,我们需要找出差异。这是一个有趣的部分,因为我们还需要考虑整个24小时的时间差异,例如晚上11:59到凌晨0:01应该返回2分钟。如果我们现在求n(i+1(-n(i(的简单减法,在这种情况下我们会得到错误的结果。以下是我的解决方案(尽管我认为还有更好的解决方案(:

const WHOLEDAY = 60 * 24;
const findDifference = (a, b) => {
let diff = 0;
while (a != b) {
a = (a + 1) % WHOLEDAY;
diff += 1;
}
return diff;
};
strArr.map((v, i, arr) => findDifference(v, arr[(i + 1) % arr.length]));

为了不丢失最晚时间和最早时间(第二天(之间的差异,我们需要将最后一个值与第一个值进行比较。

然后我们所需要做的就是将其缩小到最小的差异:

strArr.reduce((a, b) => (a < b ? a : b));

给你。不过,我并不关心输入错误的情况。

const arr1 = ["1:10pm", "4:40am", "5:00pm"];
const arr2 = ["11:50pm", "0:30am"];
const arr3 = ["4:23am", "4:25am", "4:26am", "4:28am"];
const arr4 = ["0:00am"];
const WHOLEDAY = 60 * 24;
const findDifference = (a, b) => {
let diff = 0;
while (a != b) {
a = (a + 1) % WHOLEDAY;
diff += 1;
}
return diff;
};
const timeDifference = (strArr) =>
strArr
.map((time) => /(d{1,2}):(d{1,2})(am|pm)/.exec(time).slice(1))
.map(([hour, min, midday]) =>
(Number(hour) + (midday === `pm` ? 12 : 0)) * 60 + Number(min))
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
.map((v, i, arr) => findDifference(v, arr[(i + 1) % arr.length]))
.reduce((a, b) => (a < b ? a : b));
console.log(timeDifference(arr1)); // 230
console.log(timeDifference(arr2)); // 40
console.log(timeDifference(arr3)); // 1
console.log(timeDifference(arr4)); // 0

最新更新