Skip to content

Commit 2348472

Browse files
committed
feat: add solutions to lc problem: No.379
No.0379.Design Phone Directory
1 parent 90788e4 commit 2348472

File tree

7 files changed

+427
-134
lines changed

7 files changed

+427
-134
lines changed

solution/0300-0399/0379.Design Phone Directory/README.md

Lines changed: 150 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -73,43 +73,38 @@ directory.check(2);
7373

7474
<!-- solution:start -->
7575

76-
### 方法一
76+
### 方法一:哈希表
77+
78+
我们可以使用一个哈希集合 `available` 来存储未被分配的电话号码,初始时,哈希表中存储的是 `[0, 1, 2, ..., maxNumbers - 1]`
79+
80+
调用 `get` 方法时,我们从 `available` 中取出一个未被分配的电话号码,如果 `available` 为空,则返回 `-1`。时间复杂度 $O(1)$。
81+
82+
调用 `check` 方法时,我们只需要判断 `number` 是否在 `available` 中即可。时间复杂度 $O(1)$。
83+
84+
调用 `release` 方法时,我们将 `number` 添加到 `available` 中。时间复杂度 $O(1)$。
85+
86+
空间复杂度 $O(n)$,其中 $n$ 是 `maxNumbers` 的值。
7787

7888
<!-- tabs:start -->
7989

8090
#### Python3
8191

8292
```python
8393
class PhoneDirectory:
94+
8495
def __init__(self, maxNumbers: int):
85-
"""
86-
Initialize your data structure here
87-
@param maxNumbers - The maximum numbers that can be stored in the phone directory.
88-
"""
89-
self.provided = [False] * maxNumbers
96+
self.available = set(range(maxNumbers))
9097

9198
def get(self) -> int:
92-
"""
93-
Provide a number which is not assigned to anyone.
94-
@return - Return an available number. Return -1 if none is available.
95-
"""
96-
for i in range(len(self.provided)):
97-
if not self.provided[i]:
98-
self.provided[i] = True
99-
return i
100-
return -1
99+
if not self.available:
100+
return -1
101+
return self.available.pop()
101102

102103
def check(self, number: int) -> bool:
103-
"""
104-
Check if a number is available or not.
105-
"""
106-
return not self.provided[number]
104+
return number in self.available
107105

108106
def release(self, number: int) -> None:
109-
"""
110-
Recycle or release a number.
111-
"""
112-
self.provided[number] = False
107+
self.available.add(number)
113108

114109

115110
# Your PhoneDirectory object will be instantiated and called as such:
@@ -123,39 +118,29 @@ class PhoneDirectory:
123118

124119
```java
125120
class PhoneDirectory {
121+
private Set<Integer> available = new HashSet<>();
126122

127-
private boolean[] provided;
128-
129-
/**
130-
Initialize your data structure here
131-
@param maxNumbers - The maximum numbers that can be stored in the phone directory.
132-
*/
133123
public PhoneDirectory(int maxNumbers) {
134-
provided = new boolean[maxNumbers];
124+
for (int i = 0; i < maxNumbers; ++i) {
125+
available.add(i);
126+
}
135127
}
136128

137-
/**
138-
Provide a number which is not assigned to anyone.
139-
@return - Return an available number. Return -1 if none is available.
140-
*/
141129
public int get() {
142-
for (int i = 0; i < provided.length; ++i) {
143-
if (!provided[i]) {
144-
provided[i] = true;
145-
return i;
146-
}
130+
if (available.isEmpty()) {
131+
return -1;
147132
}
148-
return -1;
133+
int x = available.iterator().next();
134+
available.remove(x);
135+
return x;
149136
}
150137

151-
/** Check if a number is available or not. */
152138
public boolean check(int number) {
153-
return !provided[number];
139+
return available.contains(number);
154140
}
155141

156-
/** Recycle or release a number. */
157142
public void release(int number) {
158-
provided[number] = false;
143+
available.add(number);
159144
}
160145
}
161146

@@ -168,6 +153,127 @@ class PhoneDirectory {
168153
*/
169154
```
170155

156+
#### C++
157+
158+
```cpp
159+
class PhoneDirectory {
160+
public:
161+
PhoneDirectory(int maxNumbers) {
162+
for (int i = 0; i < maxNumbers; ++i) {
163+
available.insert(i);
164+
}
165+
}
166+
167+
int get() {
168+
if (available.empty()) {
169+
return -1;
170+
}
171+
int x = *available.begin();
172+
available.erase(x);
173+
return x;
174+
}
175+
176+
bool check(int number) {
177+
return available.contains(number);
178+
}
179+
180+
void release(int number) {
181+
available.insert(number);
182+
}
183+
184+
private:
185+
unordered_set<int> available;
186+
};
187+
188+
/**
189+
* Your PhoneDirectory object will be instantiated and called as such:
190+
* PhoneDirectory* obj = new PhoneDirectory(maxNumbers);
191+
* int param_1 = obj->get();
192+
* bool param_2 = obj->check(number);
193+
* obj->release(number);
194+
*/
195+
```
196+
197+
#### Go
198+
199+
```go
200+
type PhoneDirectory struct {
201+
available map[int]bool
202+
}
203+
204+
func Constructor(maxNumbers int) PhoneDirectory {
205+
available := make(map[int]bool)
206+
for i := 0; i < maxNumbers; i++ {
207+
available[i] = true
208+
}
209+
return PhoneDirectory{available}
210+
}
211+
212+
func (this *PhoneDirectory) Get() int {
213+
for k := range this.available {
214+
delete(this.available, k)
215+
return k
216+
}
217+
return -1
218+
}
219+
220+
func (this *PhoneDirectory) Check(number int) bool {
221+
_, ok := this.available[number]
222+
return ok
223+
}
224+
225+
func (this *PhoneDirectory) Release(number int) {
226+
this.available[number] = true
227+
}
228+
229+
/**
230+
* Your PhoneDirectory object will be instantiated and called as such:
231+
* obj := Constructor(maxNumbers);
232+
* param_1 := obj.Get();
233+
* param_2 := obj.Check(number);
234+
* obj.Release(number);
235+
*/
236+
```
237+
238+
#### TypeScript
239+
240+
```ts
241+
class PhoneDirectory {
242+
private available: Set<number> = new Set();
243+
244+
constructor(maxNumbers: number) {
245+
for (let i = 0; i < maxNumbers; ++i) {
246+
this.available.add(i);
247+
}
248+
}
249+
250+
get(): number {
251+
const [x] = this.available;
252+
if (x === undefined) {
253+
return -1;
254+
}
255+
this.available.delete(x);
256+
return x;
257+
}
258+
259+
check(number: number): boolean {
260+
return this.available.has(number);
261+
}
262+
263+
release(number: number): void {
264+
this.available.add(number);
265+
}
266+
}
267+
268+
/**
269+
* Your PhoneDirectory object will be instantiated and called as such:
270+
* var obj = new PhoneDirectory(maxNumbers)
271+
* var param_1 = obj.get()
272+
* var param_2 = obj.check(number)
273+
* obj.release(number)
274+
*/
275+
```
276+
171277
<!-- tabs:end -->
172278

173279
<!-- solution:end -->

0 commit comments

Comments
 (0)