我有以下strArr数组
“下午1:10”、“凌晨4:40”、“下午5:00”
现在,我试图找到最短的时间差之间的分钟以上的时间列表。
在上面的数组中,它应该会给我230号。
所有的时间都是12小时的。(HH:上午/下午)
function TimeDifference(strArr) {
// code goes here
return strArr;
}
// keep this function call here
console.log(TimeDifference(readline()));
发布于 2022-08-04 01:52:09
因为您需要以分钟为单位的结果,所以首先我会将所有的值转换为分钟:
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:59pm - 0:01am应该返回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
https://stackoverflow.com/questions/73201816
复制相似问题