@@ -73,43 +73,38 @@ directory.check(2);
73
73
74
74
<!-- solution:start -->
75
75
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 ` 的值。
77
87
78
88
<!-- tabs:start -->
79
89
80
90
#### Python3
81
91
82
92
``` python
83
93
class PhoneDirectory :
94
+
84
95
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))
90
97
91
98
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()
101
102
102
103
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
107
105
108
106
def release (self , number : int ) -> None :
109
- """
110
- Recycle or release a number.
111
- """
112
- self .provided[number] = False
107
+ self .available.add(number)
113
108
114
109
115
110
# Your PhoneDirectory object will be instantiated and called as such:
@@ -123,39 +118,29 @@ class PhoneDirectory:
123
118
124
119
``` java
125
120
class PhoneDirectory {
121
+ private Set<Integer > available = new HashSet<> ();
126
122
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
- */
133
123
public PhoneDirectory (int maxNumbers ) {
134
- provided = new boolean [maxNumbers];
124
+ for (int i = 0 ; i < maxNumbers; ++ i) {
125
+ available. add(i);
126
+ }
135
127
}
136
128
137
- /**
138
- Provide a number which is not assigned to anyone.
139
- @return - Return an available number. Return -1 if none is available.
140
- */
141
129
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 ;
147
132
}
148
- return - 1 ;
133
+ int x = available. iterator(). next();
134
+ available. remove(x);
135
+ return x;
149
136
}
150
137
151
- /* * Check if a number is available or not. */
152
138
public boolean check (int number ) {
153
- return ! provided[ number] ;
139
+ return available . contains( number) ;
154
140
}
155
141
156
- /* * Recycle or release a number. */
157
142
public void release (int number ) {
158
- provided[ number] = false ;
143
+ available . add( number) ;
159
144
}
160
145
}
161
146
@@ -168,6 +153,127 @@ class PhoneDirectory {
168
153
*/
169
154
```
170
155
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
+
171
277
<!-- tabs:end -->
172
278
173
279
<!-- solution:end -->
0 commit comments