最小时间差

159 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

最小时间差:中等难度

图片1.png

function findMinDifference(timePoints: string[]): number {
    if(timePoints.length >= 1440) return 0;
    let resArr = [];
    timePoints.forEach((item, index) => {
        let time = item.split(':');
        resArr[index] = Number(time[0]) * 60 + Number(time[1]);
    })
    let newArr = resArr.sort((a, b) => { return a - b; });
    let diffArr = [];
    for(let i = 0; i < newArr.length - 1; i++){
        if(i === newArr.length - 2){
            if(newArr[i + 1] - newArr[0] > 720){
                diffArr.push(newArr[0] + 1440 - newArr[i + 1])
            } else {
                diffArr.push(newArr[i + 1] - newArr[0])
            }
        }
        if(newArr[i + 1] - newArr[i] > 720){
            diffArr.push(newArr[i] + 1440 - newArr[i + 1])
        } else {
            diffArr.push(newArr[i + 1] - newArr[i])
        }
    }
    diffArr = diffArr.sort((a, b) => {return a-b});
    return diffArr[0];
}

思路:

  • 先把"HH:MM"格式的时间转化成分钟数,然后用数组的sort方法先排序一遍,得到从小到大的的有序数组,保证后面计算差值的时候当前时间减去后一位的时间一定小于当前时间减去后两位的时间
  • 然后遍历排序后的数组,计算并且保存前一项减后一项的差值。这里需要注意下循环遍历时循环次数的取值范围。通过下标取值的话一定是从0开始的,一般判断条件是 i < arr.length,这样会取值到数组的最后一位。而最后一位后面没有值和它相减,所以我这里取的是 i < arr.length - 1

图片2.png

  • 有效差值计算,给定的数组时间可以分为两种类型

企业微信截图_16425660472402.png

企业微信截图_16425662093354.png

企业微信截图_16425663063927.png

  • 上面三张图其实就是一种情况,time2 - time1 <= 12,一旦差值大于十二,必定会有另外一条路线比它的差值小(这里算的是以整数小时计算,转化成分钟是一样的)

企业微信截图_16425667021265.png

  • 上面这张图就是第二种情况,time1 - time2 > 12,time3的位置和time1表示的时间相同,最短的时间差应该是time3 - time2,不是time2 - time1
  • 怎么得到time3? 其实就是time1的时间加上整个周期的时间,图上的是24h,转化成分钟是1440
  • 然后再处理一下特殊情况,最后一位后面没有与它相减的数了,这里需要与第一位比较一下,求一下差值
  • 个人的做法是将所有的插值都收集起来保存到一个数组中,然后排序,最小的在最前面,返回数组的第一项就是差值最小的那个

最后:补上一下 if(timePoints.length >= 1440) return 0; 提升运行效率

企业微信截图_16425672434773.png

  • 也不知道这个运行时长准不准,可能和电脑有关,每次的时间都不太一样,能跑就行【手动狗头】