Skip to content

Commit 847c11d

Browse files
committed
feat: add solutions to lc problem: No.1797
No.1797.Design Authentication Manager
1 parent cb5197b commit 847c11d

File tree

6 files changed

+297
-79
lines changed

6 files changed

+297
-79
lines changed

solution/1700-1799/1797.Design Authentication Manager/README.md

+105-25
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ authenticationManager.<code>countUnexpiredTokens</code>(15); // tokenId 为 "bbb
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63-
用哈希表存放 token 与对应的过期时间。
63+
**方法一:哈希表**
64+
65+
维护一个哈希表 $d$,键为 `tokenId`,值为过期时间。
66+
67+
时间复杂度方面,`generate``renew` 操作的时间复杂度均为 $O(1)$,`countUnexpiredTokens` 操作的时间复杂度为 $O(n)$,其中 $n$ 为哈希表 $d$ 的键值对个数。
68+
69+
空间复杂度为 $O(n)$,其中 $n$ 为哈希表 $d$ 的键值对个数。
6470

6571
<!-- tabs:start -->
6672

@@ -70,25 +76,21 @@ authenticationManager.<code>countUnexpiredTokens</code>(15); // tokenId 为 "bbb
7076

7177
```python
7278
class AuthenticationManager:
79+
7380
def __init__(self, timeToLive: int):
74-
self.timeToLive = timeToLive
75-
self.tokens = {}
81+
self.t = timeToLive
82+
self.d = defaultdict(int)
7683

7784
def generate(self, tokenId: str, currentTime: int) -> None:
78-
self.tokens[tokenId] = currentTime + self.timeToLive
85+
self.d[tokenId] = currentTime + self.t
7986

8087
def renew(self, tokenId: str, currentTime: int) -> None:
81-
expire_time = self.tokens.get(tokenId)
82-
if expire_time is None or expire_time <= currentTime:
88+
if self.d[tokenId] <= currentTime:
8389
return
84-
self.tokens[tokenId] = currentTime + self.timeToLive
90+
self.d[tokenId] = currentTime + self.t
8591

8692
def countUnexpiredTokens(self, currentTime: int) -> int:
87-
unexpiredCount = 0
88-
for val in self.tokens.values():
89-
if val > currentTime:
90-
unexpiredCount += 1
91-
return unexpiredCount
93+
return sum(exp > currentTime for exp in self.d.values())
9294

9395

9496
# Your AuthenticationManager object will be instantiated and called as such:
@@ -104,34 +106,32 @@ class AuthenticationManager:
104106

105107
```java
106108
class AuthenticationManager {
107-
private int timeToLive;
108-
private Map<String, Integer> tokens;
109+
private int t;
110+
private Map<String, Integer> d = new HashMap<>();
109111

110112
public AuthenticationManager(int timeToLive) {
111-
this.timeToLive = timeToLive;
112-
tokens = new HashMap<>();
113+
t = timeToLive;
113114
}
114115

115116
public void generate(String tokenId, int currentTime) {
116-
tokens.put(tokenId, currentTime + timeToLive);
117+
d.put(tokenId, currentTime + t);
117118
}
118119

119120
public void renew(String tokenId, int currentTime) {
120-
Integer expireTime = tokens.get(tokenId);
121-
if (expireTime == null || expireTime <= currentTime) {
121+
if (d.getOrDefault(tokenId, 0) <= currentTime) {
122122
return;
123123
}
124-
tokens.put(tokenId, currentTime + timeToLive);
124+
generate(tokenId, currentTime);
125125
}
126126

127127
public int countUnexpiredTokens(int currentTime) {
128-
int unexpiredCount = 0;
129-
for (Integer val : tokens.values()) {
130-
if (val > currentTime) {
131-
++unexpiredCount;
128+
int ans = 0;
129+
for (int exp : d.values()) {
130+
if (exp > currentTime) {
131+
++ans;
132132
}
133133
}
134-
return unexpiredCount;
134+
return ans;
135135
}
136136
}
137137

@@ -144,6 +144,86 @@ class AuthenticationManager {
144144
*/
145145
```
146146

147+
### **C++**
148+
149+
```cpp
150+
class AuthenticationManager {
151+
public:
152+
AuthenticationManager(int timeToLive) {
153+
t = timeToLive;
154+
}
155+
156+
void generate(string tokenId, int currentTime) {
157+
d[tokenId] = currentTime + t;
158+
}
159+
160+
void renew(string tokenId, int currentTime) {
161+
if (d[tokenId] <= currentTime) return;
162+
generate(tokenId, currentTime);
163+
}
164+
165+
int countUnexpiredTokens(int currentTime) {
166+
int ans = 0;
167+
for (auto& [_, v] : d) ans += v > currentTime;
168+
return ans;
169+
}
170+
171+
private:
172+
int t;
173+
unordered_map<string, int> d;
174+
};
175+
176+
/**
177+
* Your AuthenticationManager object will be instantiated and called as such:
178+
* AuthenticationManager* obj = new AuthenticationManager(timeToLive);
179+
* obj->generate(tokenId,currentTime);
180+
* obj->renew(tokenId,currentTime);
181+
* int param_3 = obj->countUnexpiredTokens(currentTime);
182+
*/
183+
```
184+
185+
### **Go**
186+
187+
```go
188+
type AuthenticationManager struct {
189+
t int
190+
d map[string]int
191+
}
192+
193+
func Constructor(timeToLive int) AuthenticationManager {
194+
return AuthenticationManager{timeToLive, map[string]int{}}
195+
}
196+
197+
func (this *AuthenticationManager) Generate(tokenId string, currentTime int) {
198+
this.d[tokenId] = currentTime + this.t
199+
}
200+
201+
func (this *AuthenticationManager) Renew(tokenId string, currentTime int) {
202+
if v, ok := this.d[tokenId]; !ok || v <= currentTime {
203+
return
204+
}
205+
this.Generate(tokenId, currentTime)
206+
}
207+
208+
func (this *AuthenticationManager) CountUnexpiredTokens(currentTime int) int {
209+
ans := 0
210+
for _, exp := range this.d {
211+
if exp > currentTime {
212+
ans++
213+
}
214+
}
215+
return ans
216+
}
217+
218+
/**
219+
* Your AuthenticationManager object will be instantiated and called as such:
220+
* obj := Constructor(timeToLive);
221+
* obj.Generate(tokenId,currentTime);
222+
* obj.Renew(tokenId,currentTime);
223+
* param_3 := obj.CountUnexpiredTokens(currentTime);
224+
*/
225+
```
226+
147227
### **TypeScript**
148228

149229
```ts

solution/1700-1799/1797.Design Authentication Manager/README_EN.md

+101-27
Original file line numberDiff line numberDiff line change
@@ -60,25 +60,21 @@ authenticationManager.<code>countUnexpiredTokens</code>(15); // The token with t
6060

6161
```python
6262
class AuthenticationManager:
63+
6364
def __init__(self, timeToLive: int):
64-
self.timeToLive = timeToLive
65-
self.tokens = {}
65+
self.t = timeToLive
66+
self.d = defaultdict(int)
6667

6768
def generate(self, tokenId: str, currentTime: int) -> None:
68-
self.tokens[tokenId] = currentTime + self.timeToLive
69+
self.d[tokenId] = currentTime + self.t
6970

7071
def renew(self, tokenId: str, currentTime: int) -> None:
71-
expire_time = self.tokens.get(tokenId)
72-
if expire_time is None or expire_time <= currentTime:
72+
if self.d[tokenId] <= currentTime:
7373
return
74-
self.tokens[tokenId] = currentTime + self.timeToLive
74+
self.d[tokenId] = currentTime + self.t
7575

7676
def countUnexpiredTokens(self, currentTime: int) -> int:
77-
unexpiredCount = 0
78-
for val in self.tokens.values():
79-
if val > currentTime:
80-
unexpiredCount += 1
81-
return unexpiredCount
77+
return sum(exp > currentTime for exp in self.d.values())
8278

8379

8480
# Your AuthenticationManager object will be instantiated and called as such:
@@ -92,34 +88,32 @@ class AuthenticationManager:
9288

9389
```java
9490
class AuthenticationManager {
95-
private int timeToLive;
96-
private Map<String, Integer> tokens;
91+
private int t;
92+
private Map<String, Integer> d = new HashMap<>();
9793

9894
public AuthenticationManager(int timeToLive) {
99-
this.timeToLive = timeToLive;
100-
tokens = new HashMap<>();
95+
t = timeToLive;
10196
}
102-
97+
10398
public void generate(String tokenId, int currentTime) {
104-
tokens.put(tokenId, currentTime + timeToLive);
99+
d.put(tokenId, currentTime + t);
105100
}
106-
101+
107102
public void renew(String tokenId, int currentTime) {
108-
Integer expireTime = tokens.get(tokenId);
109-
if (expireTime == null || expireTime <= currentTime) {
103+
if (d.getOrDefault(tokenId, 0) <= currentTime) {
110104
return;
111105
}
112-
tokens.put(tokenId, currentTime + timeToLive);
106+
generate(tokenId, currentTime);
113107
}
114-
108+
115109
public int countUnexpiredTokens(int currentTime) {
116-
int unexpiredCount = 0;
117-
for (Integer val : tokens.values()) {
118-
if (val > currentTime) {
119-
++unexpiredCount;
110+
int ans = 0;
111+
for (int exp : d.values()) {
112+
if (exp > currentTime) {
113+
++ans;
120114
}
121115
}
122-
return unexpiredCount;
116+
return ans;
123117
}
124118
}
125119

@@ -132,6 +126,86 @@ class AuthenticationManager {
132126
*/
133127
```
134128

129+
### **C++**
130+
131+
```cpp
132+
class AuthenticationManager {
133+
public:
134+
AuthenticationManager(int timeToLive) {
135+
t = timeToLive;
136+
}
137+
138+
void generate(string tokenId, int currentTime) {
139+
d[tokenId] = currentTime + t;
140+
}
141+
142+
void renew(string tokenId, int currentTime) {
143+
if (d[tokenId] <= currentTime) return;
144+
generate(tokenId, currentTime);
145+
}
146+
147+
int countUnexpiredTokens(int currentTime) {
148+
int ans = 0;
149+
for (auto& [_, v] : d) ans += v > currentTime;
150+
return ans;
151+
}
152+
153+
private:
154+
int t;
155+
unordered_map<string, int> d;
156+
};
157+
158+
/**
159+
* Your AuthenticationManager object will be instantiated and called as such:
160+
* AuthenticationManager* obj = new AuthenticationManager(timeToLive);
161+
* obj->generate(tokenId,currentTime);
162+
* obj->renew(tokenId,currentTime);
163+
* int param_3 = obj->countUnexpiredTokens(currentTime);
164+
*/
165+
```
166+
167+
### **Go**
168+
169+
```go
170+
type AuthenticationManager struct {
171+
t int
172+
d map[string]int
173+
}
174+
175+
func Constructor(timeToLive int) AuthenticationManager {
176+
return AuthenticationManager{timeToLive, map[string]int{}}
177+
}
178+
179+
func (this *AuthenticationManager) Generate(tokenId string, currentTime int) {
180+
this.d[tokenId] = currentTime + this.t
181+
}
182+
183+
func (this *AuthenticationManager) Renew(tokenId string, currentTime int) {
184+
if v, ok := this.d[tokenId]; !ok || v <= currentTime {
185+
return
186+
}
187+
this.Generate(tokenId, currentTime)
188+
}
189+
190+
func (this *AuthenticationManager) CountUnexpiredTokens(currentTime int) int {
191+
ans := 0
192+
for _, exp := range this.d {
193+
if exp > currentTime {
194+
ans++
195+
}
196+
}
197+
return ans
198+
}
199+
200+
/**
201+
* Your AuthenticationManager object will be instantiated and called as such:
202+
* obj := Constructor(timeToLive);
203+
* obj.Generate(tokenId,currentTime);
204+
* obj.Renew(tokenId,currentTime);
205+
* param_3 := obj.CountUnexpiredTokens(currentTime);
206+
*/
207+
```
208+
135209
### **TypeScript**
136210

137211
```ts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class AuthenticationManager {
2+
public:
3+
AuthenticationManager(int timeToLive) {
4+
t = timeToLive;
5+
}
6+
7+
void generate(string tokenId, int currentTime) {
8+
d[tokenId] = currentTime + t;
9+
}
10+
11+
void renew(string tokenId, int currentTime) {
12+
if (d[tokenId] <= currentTime) return;
13+
generate(tokenId, currentTime);
14+
}
15+
16+
int countUnexpiredTokens(int currentTime) {
17+
int ans = 0;
18+
for (auto& [_, v] : d) ans += v > currentTime;
19+
return ans;
20+
}
21+
22+
private:
23+
int t;
24+
unordered_map<string, int> d;
25+
};
26+
27+
/**
28+
* Your AuthenticationManager object will be instantiated and called as such:
29+
* AuthenticationManager* obj = new AuthenticationManager(timeToLive);
30+
* obj->generate(tokenId,currentTime);
31+
* obj->renew(tokenId,currentTime);
32+
* int param_3 = obj->countUnexpiredTokens(currentTime);
33+
*/

0 commit comments

Comments
 (0)