Skip to content

Commit c5d27da

Browse files
committed
1604. Alert Using Same Key-Card Three or More Times in a One Hour Period: AC
1 parent 3926e64 commit c5d27da

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

src/solution/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1209,3 +1209,4 @@ mod s1599_maximum_profit_of_operating_a_centennial_wheel;
12091209
mod s1600_throne_inheritance;
12101210
mod s1601_maximum_number_of_achievable_transfer_requests;
12111211
mod s1603_design_parking_system;
1212+
mod s1604_alert_using_same_key_card_three_or_more_times_in_a_one_hour_period;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* [1604] Alert Using Same Key-Card Three or More Times in a One Hour Period
3+
*
4+
* LeetCode company workers use key-cards to unlock office doors. Each time a worker uses their key-card, the security system saves the worker's name and the time when it was used. The system emits an alert if any worker uses the key-card three or more times in a one-hour period.
5+
* You are given a list of strings keyName and keyTime where [keyName[i], keyTime[i]] corresponds to a person's name and the time when their key-card was used in a single day.
6+
* Access times are given in the 24-hour time format "HH:MM", such as "23:51" and "09:49".
7+
* Return a list of unique worker names who received an alert for frequent keycard use. Sort the names in ascending order alphabetically.
8+
* Notice that "10:00" - "11:00" is considered to be within a one-hour period, while "22:51" - "23:52" is not considered to be within a one-hour period.
9+
*
10+
* Example 1:
11+
*
12+
* Input: keyName = ["daniel","daniel","daniel","luis","luis","luis","luis"], keyTime = ["10:00","10:40","11:00","09:00","11:00","13:00","15:00"]
13+
* Output: ["daniel"]
14+
* Explanation: "daniel" used the keycard 3 times in a one-hour period ("10:00","10:40", "11:00").
15+
*
16+
* Example 2:
17+
*
18+
* Input: keyName = ["alice","alice","alice","bob","bob","bob","bob"], keyTime = ["12:01","12:00","18:00","21:00","21:20","21:30","23:00"]
19+
* Output: ["bob"]
20+
* Explanation: "bob" used the keycard 3 times in a one-hour period ("21:00","21:20", "21:30").
21+
*
22+
*
23+
* Constraints:
24+
*
25+
* 1 <= keyName.length, keyTime.length <= 10^5
26+
* keyName.length == keyTime.length
27+
* keyTime[i] is in the format "HH:MM".
28+
* [keyName[i], keyTime[i]] is unique.
29+
* 1 <= keyName[i].length <= 10
30+
* keyName[i] contains only lowercase English letters.
31+
*
32+
*/
33+
pub struct Solution {}
34+
35+
// problem: https://leetcode.com/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/
36+
// discuss: https://leetcode.com/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/discuss/?currentPage=1&orderBy=most_votes&query=
37+
38+
// submission codes start here
39+
40+
impl Solution {
41+
pub fn alert_names(key_name: Vec<String>, key_time: Vec<String>) -> Vec<String> {
42+
let mut map = std::collections::HashMap::new();
43+
44+
for (name, time) in key_name.iter().zip(key_time.iter()) {
45+
let time = time
46+
.split(':')
47+
.map(|s| s.parse::<i32>().unwrap())
48+
.collect::<Vec<_>>();
49+
let time = time[0] * 60 + time[1];
50+
map.entry(name).or_insert(vec![]).push(time);
51+
}
52+
53+
let mut result = vec![];
54+
55+
for (name, times) in map {
56+
let mut times = times;
57+
times.sort();
58+
for (i, j) in (2..times.len()).enumerate() {
59+
if times[j] - times[i] <= 60 {
60+
result.push(name.to_string());
61+
break;
62+
}
63+
}
64+
}
65+
66+
result.sort_unstable();
67+
68+
result
69+
}
70+
}
71+
72+
// submission codes end
73+
74+
#[cfg(test)]
75+
mod tests {
76+
use super::*;
77+
78+
#[test]
79+
fn test_1604_example_1() {
80+
let key_name = vec_string!["daniel", "daniel", "daniel", "luis", "luis", "luis", "luis"];
81+
let key_time = vec_string!["10:00", "10:40", "11:00", "09:00", "11:00", "13:00", "15:00"];
82+
83+
let result = vec_string!["daniel"];
84+
85+
assert_eq!(Solution::alert_names(key_name, key_time), result);
86+
}
87+
88+
#[test]
89+
fn test_1604_example_2() {
90+
let key_name = vec_string!["alice", "alice", "alice", "bob", "bob", "bob", "bob"];
91+
let key_time = vec_string!["12:01", "12:00", "18:00", "21:00", "21:20", "21:30", "23:00"];
92+
93+
let result = vec_string!["bob"];
94+
95+
assert_eq!(Solution::alert_names(key_name, key_time), result);
96+
}
97+
}

0 commit comments

Comments
 (0)