题目描述
力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个警告 。
给你字符串数组keyName
和 keyTime
,其中 [keyName[i], keyTime[i]]
对应一个人的名字和他在 某一天 内使用员工卡的时间。
使用时间的格式是 24小时制 ,形如 “HH:MM” ,比方说 "23:51"
和 "09:49"
。
请你返回去重后的收到系统警告的员工名字,将它们按 字典序升序 排序后返回。
请注意 "10:00"
- "11:00"
视为一个小时时间范围内,而 "23:51"
- "00:10"
不被视为一小时内,因为系统记录的是某一天内的使用情况。
示例
输入:keyName = [“daniel”,“daniel”,“daniel”,“luis”,“luis”,“luis”,“luis”], keyTime = [“10:00”,“10:40”,“11:00”,“09:00”,“11:00”,“13:00”,“15:00”]
输出:[“daniel”]
思路
本题可以直接模拟解决。
1.维护一个map。key为员工名字,value为该员工刷卡的时间list。
2.接下来对这个map进行遍历,如果该员工的时间list每3个的间隔时间超过了一个小时,那么就把他记录到结果集返回。
代码
class Solution {
public List<String> alertNames(String[] keyName, String[] keyTime) {
// 初始化一个map key为员工名字 value是其刷卡的时间集合
Map<String, List<Integer>> map = new HashMap<>();
List<String> res = new ArrayList<>();
for (int i = 0; i < keyName.length; i++) {
List<Integer> times = map.getOrDefault(keyName[i], new ArrayList<>());
times.add(getMinutes(keyTime[i]));
map.put(keyName[i], times);
}
for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
List<Integer> times = entry.getValue();
Collections.sort(times);
// 判断每3个时间是否都在一个小时内
for (int i = 0; i < times.size() - 2; i++) {
if (times.get(i + 2) - times.get(i) <= 60) {
res.add(entry.getKey());
break;
}
}
}
// 结果集排序
Collections.sort(res);
return res;
}
// 时间转化
private int getMinutes(String time) {
String[] arr = time.split(":");
return Integer.parseInt(arr[0]) * 60 + Integer.parseInt(arr[1]);
}
}
Map.Entry是java.util包中的一个接口,表示Map中的一个实体(键值对)。它有两个抽象方法:getKey()和getValue(),分别用于获取键和值。使用Map.Entry可以对Map进行遍历。而map.entrySet() 返回一个Set集合,包含了所有map中的键值对关系映射,每一个映射关系封装在一个Map.Entry对象中,该对象可以通过getKey和getValue方法获取键和值。
举个例子:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + " Value: " + entry.getValue());
}
// 输出结果
// Key: A Value: 1
// Key: B Value: 2
// Key: C Value: 3