求一个算法解决时间求和

有这么一个问题:

8:00-9:30
9:00-11:00
9:00-12:00
13:00-14:24
19:00-22:00
20:00-21:30
21:50-23:00

给出一天之内(0:00-24:00)几组时间段,求这些时间段总和。

注意:上面几组时间段中,可能会有包含关系或交叉关系

阅读 2.6k
2 个回答

可以先将重合时间段合并(将 xx:xx 的形式化为分钟以简便),其实就是 leetcode 上的这道题 Merge Intervals,可以参考我的题解 https://github.com/hanzichi/l...,然后就简单了,循环一遍相加即可

function formatTime(str) {
        str = ('000' + str).slice(-5);
        return new Date('2017-12-17T03:' + str)
    }

    function timeMax(s, e) {
        s = ('000' + s).slice(-5);
        e = ('000' + e).slice(-5);
        return new Date('2017-12-17T03:' + s) > new Date('2017-12-17T03:' + e) ? s : e
    }

    function merge(intervals) {
        intervals.sort(function(a, b) {
            if (formatTime(a[0]) !== formatTime(b[0]))
                return formatTime(a[0]) - formatTime(b[0]);
            return formatTime(a[1]) - formatTime(b[1]);
        });

        var len = intervals.length,
            ans = [],
            start, end;

        for (var i = 0; i < len; i++) {
            var s = intervals[i][0],
                e = intervals[i][1];
            if (start === undefined)
                start = s, end = e;
            else if (formatTime(s) <= formatTime(end)) {
                end = timeMax(e, end);
            } else {
                var part = [start, end];
                ans.push(part);
                start = s;
                end = e;
            }
        }

        if (start !== undefined) {
            var part = [start, end];
            ans.push(part);
        }

        return ans;
    };

    var arr = [
        ['8:00', '9:30'],
        ['9:00', '11:00'],
        ['13:00', '14:24'],
        ['19:00', '22:00'],
        ['20:00', '21:30'],
        ['19:00', '22:00'],
        ['21:50', '23:00']
    ]



    console.log(JSON.stringify(merge(arr)))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题