1. 程式人生 > 實用技巧 >LeedCode刷題:5516.警告一小時內使用相同員工卡

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