力扣刷题日记-1604. 警告一小时内使用相同员工卡大于等于三次的人

98 阅读2分钟

这道题原本可以一次性通过的,奈何太粗心,后面要求返回字典序升序,所以还要调用一次sort()方法

力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个 警告 。

给你字符串数组 keyName 和 keyTime ,其中 [keyName[i], keyTime[i]] 对应一个人的名字和他在 某一天 内使用员工卡的时间。

使用时间的格式是 24小时制 ,形如 "HH:MM" ,比方说 "23:51" 和 "09:49" 。

请你返回去重后的收到系统警告的员工名字,将它们按 字典序升序 排序后返回。

请注意 "10:00" - "11:00" 视为一个小时时间范围内,而 "22:51" - "23:52" 不被视为一小时时间范围内。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/al… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

    1. 先讲按照人,将打卡时间分到个人分组里面
    1. 将每个人的打卡时间化做整形数,最好排一下序,以防后台手动操作顺序错乱
    1. 循环每个人的时间次数,找出分组中60分钟内打了三次卡的人类
    1. 需要注意的是找到了就break,不需要再次找了,当然也可以用一个set来去重,但是浪费时间,还不如找到就break呢,直接找下一个比较好.
/**
 * @param {string[]} keyName
 * @param {string[]} keyTime
 * @return {string[]}
 */
var alertNames = function (keyName, keyTime) {
    let map = new Map()
    for(let i = 0,j=0; i < keyName.length,j < keyTime.length; i++,j++) {
        let name = keyName[i],time = keyTime[j];
        let timeArr = time.split(":")
        const hour = timeArr[0] * 60 + (+timeArr[1])
        if(!map.has(name)) {
            map.set(name, [hour])
        }else {
            map.get(name).push(hour)
        }
    }
    let ans = []
    for(let item of map) {
        item[1].sort((a,b) => a - b)
        for(let i = 2; i < item[1].length; i++) {
            if(item[1][i] - item[1][i - 2] <= 60) {
                ans.push(item[0])
                break // 找到了跳出循环
            }
        }
    }
    ans.sort()  // 字典序升序 排序后返回
    return ans
};