LeetCode 1604.警告一小时内使用员工卡大于等于三次的人(c++)

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

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

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

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

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

请注意 "10:00" - "11:00" 视为一个小时时间范围内,而 "23:51" - "00:10" 不被视为一小时内,因为系统记录的是某一天内的使用情况。

示例 1 :

输入:keyName = ["daniel","daniel","daniel","luis","luis","luis","luis"], keyTime = ["10:00","10:40","11:00","09:00","11:00","13:00","15:00"]
输出:["daniel"]
解释:"daniel" 在一小时内使用了 3 次员工卡("10:00","10:40","11:00")。

示例 2:

输入:keyName = ["alice","alice","alice","bob","bob","bob","bob"], keyTime = ["12:01","12:00","18:00","21:00","21:20","21:30","23:00"]
输出:["bob"]
解释:"bob" 在一小时内使用了 3 次员工卡("21:00","21:20","21:30")。

提示:

1 <= keyName.length, keyTime.length <= 105 keyName.length == keyTime.length keyTime 格式为 "HH:MM" 。 保证 [keyName[i], keyTime[i]] 形成的二元对 互不相同 。 1 <= keyName[i].length <= 10 keyName[i] 只包含小写英文字母。

二、思路分析

首先一个名字对应几个时间,这就让我觉得有些棘手。看了答案才知道可以用容器的方法来解决。可以使用一个字符串作为键,用一个int型的容器作为值。

然后就是对时间的处理,可以直接将其化为分钟再进行记录,这样就可以避免跨天的情况被误算。

再就是for (auto &[name, list] : s)这个用法,将s中的键和值都取出来,并进行处理,将符合题意的name添加到最终要作为结果返回的容器中去。

三、AC代码

class Solution {
public:
    vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {

        unordered_map<string,vector<int>>s;
        int n=keyName.size();
        for(int i=0;i<n;i++){
           string name = keyName[i];
            string time = keyTime[i];
            int hour = (time[0] - '0') * 10 + (time[1] - '0');
            int minute = (time[3] - '0') * 10 + (time[4] - '0');
            s[name].emplace_back(hour * 60 + minute);
        }
         vector<string> res;
        for (auto &[name, list] : s) {
            sort(list.begin(), list.end());
            int size = list.size();
            for (int i = 2; i < size; i++) {
                int time1 = list[i - 2], time2 = list[i];
                int difference = time2 - time1;
                if (difference <= 60) {
                    res.emplace_back(name);
                    break;
                }
            }
        }
        
return res;
    }
};

四、总结

今日的每日一题,对我来说还是有难度的。哈希表还是用法蛮多的