这道题原本可以一次性通过的,奈何太粗心,后面要求返回字典序升序,所以还要调用一次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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
-
- 先讲按照人,将打卡时间分到个人分组里面
-
- 将每个人的打卡时间化做整形数,最好排一下序,以防后台手动操作顺序错乱
-
- 循环每个人的时间次数,找出分组中60分钟内打了三次卡的人类
-
- 需要注意的是找到了就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
};