Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4cdb9bb

Browse files
feat: add solutions to lc problem: No.379 (doocs#3014)
No.0379.Design Phone Directory
1 parent d1b2fdb commit 4cdb9bb

File tree

7 files changed

+424
-131
lines changed

7 files changed

+424
-131
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)

AltStyle によって変換されたページ (->オリジナル) /