LeetCode 1604 警告一小时内使用相同员工卡大于等于三次的人


题目描述

力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个警告
给你字符串数组keyNamekeyTime ,其中 [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

猜你喜欢

转载自blog.csdn.net/juggle_gap_horse/article/details/128922146