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 };