Skip to content

Commit 363a38a

Browse files
committed
feat: add solutions to lc problem: No.1604
No.1604.Alert Using Same Key-Card Three or More Times in a One Hour Period
1 parent 50c3538 commit 363a38a

File tree

7 files changed

+316
-5
lines changed

7 files changed

+316
-5
lines changed

solution/0800-0899/0809.Expressive Words/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ words = ["hello", "hi", "helo"]
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46-
**方法一:双指针**
46+
**方法一:遍历计数 + 双指针**
4747

48-
遍历数组 `words`对于每个单词 $t$,判断当前单词 $t$ 是否可以通过扩张得到 $s$,如果可以,那么答案加一。
48+
我们可以遍历数组 `words`对于数组中的每个单词 $t$,判断 $t$ 是否可以通过扩张得到 $s$,如果可以,那么答案加一。
4949

5050
因此,问题的关键在于判断单词 $t$ 是否可以通过扩张得到 $s$。这里我们通过一个 $check(s, t)$ 函数来判断。函数的具体实现逻辑如下:
5151

52-
我们首先用双指针 $i$ 和 $j$ 分别指向 $s$ 和 $t$,初始时 $i$ 和 $j$ 的值均为 $0$。
52+
首先判断 $s$ 和 $t$ 的长度关系,如果 $t$ 的长度大于 $s$,直接返回 `false`;否则,我们用双指针 $i$ 和 $j$ 分别指向 $s$ 和 $t$,初始时 $i$ 和 $j$ 的值均为 $0$。
5353

5454
如果 $i$ 和 $j$ 指向的字符不同,那么 $t$ 无法通过扩张得到 $s$,直接返回 `false`;否则,我们需要判断 $i$ 指向的字符的连续出现次数 $c_1$ 和 $j$ 指向的字符的连续出现次数 $c_2$ 的关系。如果 $c_1 \lt c_2$ 或者 $c_1 \lt 3$ 并且 $c_1 \neq c_2$,那么 $t$ 无法通过扩张得到 $s$,直接返回 `false`;否则,将 $i$ 和 $j$ 分别右移 $c_1$ 和 $c_2$ 次。继续判断。
5555

solution/1600-1699/1604.Alert Using Same Key-Card Three or More Times in a One Hour Period/README.md

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,135 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:哈希表 + 排序**
69+
70+
我们先用哈希表 $d$ 记录每个员工的所有打卡时间。
71+
72+
然后遍历哈希表,对于每个员工,我们先判断员工的打卡次数是否大于等于 3,如果不是,则跳过该员工。否则,我们将该员工的所有打卡时间按照时间先后排序,然后遍历排序后的打卡时间,判断下标距离为 $2$ 的两个时间是否在同一小时内,如果是,则将该员工加入答案数组。
73+
74+
最后,将答案数组按照字典序排序,即可得到答案。
75+
76+
时间复杂度 $O(n \times \log n)$,其中 $n$ 是数组 $keyName$ 的长度。
77+
6878
<!-- tabs:start -->
6979

7080
### **Python3**
7181

7282
<!-- 这里可写当前语言的特殊实现逻辑 -->
7383

7484
```python
75-
85+
class Solution:
86+
def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
87+
d = defaultdict(list)
88+
for name, t in zip(keyName, keyTime):
89+
t = int(t[:2]) * 60 + int(t[3:])
90+
d[name].append(t)
91+
ans = []
92+
for name, ts in d.items():
93+
if (n := len(ts)) > 2:
94+
ts.sort()
95+
for i in range(n - 2):
96+
if ts[i + 2] - ts[i] <= 60:
97+
ans.append(name)
98+
break
99+
ans.sort()
100+
return ans
76101
```
77102

78103
### **Java**
79104

80105
<!-- 这里可写当前语言的特殊实现逻辑 -->
81106

82107
```java
108+
class Solution {
109+
public List<String> alertNames(String[] keyName, String[] keyTime) {
110+
Map<String, List<Integer>> d = new HashMap<>();
111+
for (int i = 0; i < keyName.length; ++i) {
112+
String name = keyName[i];
113+
String time = keyTime[i];
114+
int t = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
115+
d.computeIfAbsent(name, k -> new ArrayList<>()).add(t);
116+
}
117+
List<String> ans = new ArrayList<>();
118+
for (var e : d.entrySet()) {
119+
var ts = e.getValue();
120+
int n = ts.size();
121+
if (n > 2) {
122+
Collections.sort(ts);
123+
for (int i = 0; i < n - 2; ++i) {
124+
if (ts.get(i + 2) - ts.get(i) <= 60) {
125+
ans.add(e.getKey());
126+
break;
127+
}
128+
}
129+
}
130+
}
131+
Collections.sort(ans);
132+
return ans;
133+
}
134+
}
135+
```
136+
137+
### **C++**
138+
139+
```cpp
140+
class Solution {
141+
public:
142+
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
143+
unordered_map<string, vector<int>> d;
144+
for (int i = 0; i < keyName.size(); ++i) {
145+
auto name = keyName[i];
146+
auto time = keyTime[i];
147+
int a, b;
148+
sscanf(time.c_str(), "%d:%d", &a, &b);
149+
int t = a * 60 + b;
150+
d[name].emplace_back(t);
151+
}
152+
vector<string> ans;
153+
for (auto& [name, ts] : d) {
154+
int n = ts.size();
155+
if (n > 2) {
156+
sort(ts.begin(), ts.end());
157+
for (int i = 0; i < n - 2; ++i) {
158+
if (ts[i + 2] - ts[i] <= 60) {
159+
ans.emplace_back(name);
160+
break;
161+
}
162+
}
163+
}
164+
}
165+
sort(ans.begin(), ans.end());
166+
return ans;
167+
}
168+
};
169+
```
83170
171+
### **Go**
172+
173+
```go
174+
func alertNames(keyName []string, keyTime []string) (ans []string) {
175+
d := map[string][]int{}
176+
for i, name := range keyName {
177+
var a, b int
178+
fmt.Sscanf(keyTime[i], "%d:%d", &a, &b)
179+
t := a*60 + b
180+
d[name] = append(d[name], t)
181+
}
182+
for name, ts := range d {
183+
n := len(ts)
184+
if n > 2 {
185+
sort.Ints(ts)
186+
for i := 0; i < n-2; i++ {
187+
if ts[i+2]-ts[i] <= 60 {
188+
ans = append(ans, name)
189+
break
190+
}
191+
}
192+
}
193+
}
194+
sort.Strings(ans)
195+
return
196+
}
84197
```
85198

86199
### **...**

solution/1600-1699/1604.Alert Using Same Key-Card Three or More Times in a One Hour Period/README_EN.md

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,116 @@
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
55+
d = defaultdict(list)
56+
for name, t in zip(keyName, keyTime):
57+
t = int(t[:2]) * 60 + int(t[3:])
58+
d[name].append(t)
59+
ans = []
60+
for name, ts in d.items():
61+
if (n := len(ts)) > 2:
62+
ts.sort()
63+
for i in range(n - 2):
64+
if ts[i + 2] - ts[i] <= 60:
65+
ans.append(name)
66+
break
67+
ans.sort()
68+
return ans
5469
```
5570

5671
### **Java**
5772

5873
```java
74+
class Solution {
75+
public List<String> alertNames(String[] keyName, String[] keyTime) {
76+
Map<String, List<Integer>> d = new HashMap<>();
77+
for (int i = 0; i < keyName.length; ++i) {
78+
String name = keyName[i];
79+
String time = keyTime[i];
80+
int t = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
81+
d.computeIfAbsent(name, k -> new ArrayList<>()).add(t);
82+
}
83+
List<String> ans = new ArrayList<>();
84+
for (var e : d.entrySet()) {
85+
var ts = e.getValue();
86+
int n = ts.size();
87+
if (n > 2) {
88+
Collections.sort(ts);
89+
for (int i = 0; i < n - 2; ++i) {
90+
if (ts.get(i + 2) - ts.get(i) <= 60) {
91+
ans.add(e.getKey());
92+
break;
93+
}
94+
}
95+
}
96+
}
97+
Collections.sort(ans);
98+
return ans;
99+
}
100+
}
101+
```
102+
103+
### **C++**
104+
105+
```cpp
106+
class Solution {
107+
public:
108+
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
109+
unordered_map<string, vector<int>> d;
110+
for (int i = 0; i < keyName.size(); ++i) {
111+
auto name = keyName[i];
112+
auto time = keyTime[i];
113+
int a, b;
114+
sscanf(time.c_str(), "%d:%d", &a, &b);
115+
int t = a * 60 + b;
116+
d[name].emplace_back(t);
117+
}
118+
vector<string> ans;
119+
for (auto& [name, ts] : d) {
120+
int n = ts.size();
121+
if (n > 2) {
122+
sort(ts.begin(), ts.end());
123+
for (int i = 0; i < n - 2; ++i) {
124+
if (ts[i + 2] - ts[i] <= 60) {
125+
ans.emplace_back(name);
126+
break;
127+
}
128+
}
129+
}
130+
}
131+
sort(ans.begin(), ans.end());
132+
return ans;
133+
}
134+
};
135+
```
59136
137+
### **Go**
138+
139+
```go
140+
func alertNames(keyName []string, keyTime []string) (ans []string) {
141+
d := map[string][]int{}
142+
for i, name := range keyName {
143+
var a, b int
144+
fmt.Sscanf(keyTime[i], "%d:%d", &a, &b)
145+
t := a*60 + b
146+
d[name] = append(d[name], t)
147+
}
148+
for name, ts := range d {
149+
n := len(ts)
150+
if n > 2 {
151+
sort.Ints(ts)
152+
for i := 0; i < n-2; i++ {
153+
if ts[i+2]-ts[i] <= 60 {
154+
ans = append(ans, name)
155+
break
156+
}
157+
}
158+
}
159+
}
160+
sort.Strings(ans)
161+
return
162+
}
60163
```
61164

62165
### **...**
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
public:
3+
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
4+
unordered_map<string, vector<int>> d;
5+
for (int i = 0; i < keyName.size(); ++i) {
6+
auto name = keyName[i];
7+
auto time = keyTime[i];
8+
int a, b;
9+
sscanf(time.c_str(), "%d:%d", &a, &b);
10+
int t = a * 60 + b;
11+
d[name].emplace_back(t);
12+
}
13+
vector<string> ans;
14+
for (auto& [name, ts] : d) {
15+
int n = ts.size();
16+
if (n > 2) {
17+
sort(ts.begin(), ts.end());
18+
for (int i = 0; i < n - 2; ++i) {
19+
if (ts[i + 2] - ts[i] <= 60) {
20+
ans.emplace_back(name);
21+
break;
22+
}
23+
}
24+
}
25+
}
26+
sort(ans.begin(), ans.end());
27+
return ans;
28+
}
29+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func alertNames(keyName []string, keyTime []string) (ans []string) {
2+
d := map[string][]int{}
3+
for i, name := range keyName {
4+
var a, b int
5+
fmt.Sscanf(keyTime[i], "%d:%d", &a, &b)
6+
t := a*60 + b
7+
d[name] = append(d[name], t)
8+
}
9+
for name, ts := range d {
10+
n := len(ts)
11+
if n > 2 {
12+
sort.Ints(ts)
13+
for i := 0; i < n-2; i++ {
14+
if ts[i+2]-ts[i] <= 60 {
15+
ans = append(ans, name)
16+
break
17+
}
18+
}
19+
}
20+
}
21+
sort.Strings(ans)
22+
return
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public List<String> alertNames(String[] keyName, String[] keyTime) {
3+
Map<String, List<Integer>> d = new HashMap<>();
4+
for (int i = 0; i < keyName.length; ++i) {
5+
String name = keyName[i];
6+
String time = keyTime[i];
7+
int t = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
8+
d.computeIfAbsent(name, k -> new ArrayList<>()).add(t);
9+
}
10+
List<String> ans = new ArrayList<>();
11+
for (var e : d.entrySet()) {
12+
var ts = e.getValue();
13+
int n = ts.size();
14+
if (n > 2) {
15+
Collections.sort(ts);
16+
for (int i = 0; i < n - 2; ++i) {
17+
if (ts.get(i + 2) - ts.get(i) <= 60) {
18+
ans.add(e.getKey());
19+
break;
20+
}
21+
}
22+
}
23+
}
24+
Collections.sort(ans);
25+
return ans;
26+
}
27+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
3+
d = defaultdict(list)
4+
for name, t in zip(keyName, keyTime):
5+
t = int(t[:2]) * 60 + int(t[3:])
6+
d[name].append(t)
7+
ans = []
8+
for name, ts in d.items():
9+
if (n := len(ts)) > 2:
10+
ts.sort()
11+
for i in range(n - 2):
12+
if ts[i + 2] - ts[i] <= 60:
13+
ans.append(name)
14+
break
15+
ans.sort()
16+
return ans

0 commit comments

Comments
 (0)