算法:计算预定时间段内已安排时间段的总时长
给定两个数组 paiban
(预定时间段) 和 paiban2
(已安排时间段),目标是计算 paiban2
中,落在 paiban
各个时间段内的已安排时间段的总时长。
改进的解决方案:
之前的方案只计算了满足条件的已安排时间段的数量,而非时长。 我们需要修改算法来计算时长。 假设时间以分钟为单位。
function calculateScheduledTime(paiban, paiban2) {
const results = paiban.map(item => {
let totalTime = 0;
const filtered = paiban2.filter(({ starttime, endtime }) => {
// 转换为分钟数方便计算
const itemStartMinutes = timeToMinutes(item.starttime);
const itemEndMinutes = timeToMinutes(item.endtime);
const startMinutes = timeToMinutes(starttime);
const endMinutes = timeToMinutes(endtime);
// 检查已安排时间段是否完全在预定时间段内
return itemStartMinutes <= startMinutes && itemEndMinutes >= endMinutes;
});
filtered.forEach(({ starttime, endtime }) => {
totalTime += timeToMinutes(endtime) - timeToMinutes(starttime);
});
return totalTime;
});
return results;
}
function timeToMinutes(time) {
const [hours, minutes] = time.split(':').map(Number);
return hours * 60 + minutes;
}
const paiban = [
{ id: 1, starttime: '08:00', mouth: 10, endtime: '09:00', checked: false },
{ id: 2, starttime: '09:00', mouth: 10, endtime: '10:00', checked: false },
{ id: 3, starttime: '10:00', mouth: 10, endtime: '11:00', checked: false },
];
const paiban2 = [
{ id: 1, starttime: '08:00', endtime: '08:10' },
{ id: 2, starttime: '08:10', endtime: '08:20' },
{ id: 3, starttime: '08:30', endtime: '08:50' },
{ id: 4, starttime: '09:00', endtime: '09:10' },
{ id: 5, starttime: '09:10', endtime: '09:20' },
{ id: 6, starttime: '10:00', endtime: '10:10' },
{ id: 7, starttime: '10:10', endtime: '10:20' },
{ id: 8, starttime: '10:20', endtime: '10:40' },
];
console.log(calculateScheduledTime(paiban, paiban2)); // [30, 20, 40] (in minutes)
这个改进后的代码首先定义了一个 timeToMinutes
函数将时间字符串转换为分钟数,然后在 calculateScheduledTime
函数中计算每个预定时间段内已安排时间段的总时长(以分钟为单位)。 输出结果更直观地反映了已安排时间的实际时长。 注意,这个算法假设已安排的时间段不会超过预定时间段。 如果需要处理这种情况,需要添加额外的逻辑。