LeedCode刷题:5516.警告一小时内使用相同员工卡

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

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

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

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

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

解题思路:

先将名字和时间分钟数存入结构体中,再将结构体:

将人名按字典序排序,名字相同则按时间排序,

然后从i开始判断和i-2是否是同一个名字且 时间要小于等于60分钟,就加入结果集中

 1 class Solution {
 2 public:
 3     /* 时间转换部分 */
 4     int change_to_int(string &a){//时间转换函数 ,将字符串转化为分钟数
 5         return ((a[0]-'0')*10+a[1]-'0')*60+(a[3]-'0')*10+a[4]-'0';
 6     }
 7     /* 员工结构体部分 */
 8     struct pos{//定义一个综合结构体,包括名字和时间
 9         string name;
10         int time;
11     };
12     vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
13         vector<string> name;
14         int n=keyName.size();
15         pos d[n];
16         /* 存入员工名和时间部分 */
17         for(int i=0;i<n;i++){//把每个人的名字和时间以pos的结构方式都存入d[n]
18             d[i]={
19                 keyName[i],
20                 change_to_int(keyTime[i])
21             };
22         }
23         /* 对员工进行排序部分 */
24         sort(d,d+n,[](pos&a,pos&b){//如果名字不同就按名字字典序排序,名字相同就按时间排序
25             if(a.name!=b.name)
26                 return a.name<b.name;
27             else
28                 return a.time<b.time;
29         });
30         /* 查找部分 */
31         for(int i=2;i<n;i++){
32             if(name.size()&&name.back()==d[i].name)
33                 continue;
34             if(d[i].name==d[i-2].name&&d[i].time-d[i-2].time<=60){
35                 name.push_back(d[i].name);
36             }
37         }
38         return name;
39     }
40 };
原文地址:https://www.cnblogs.com/nilbook/p/13767354.html