Fork me on GitHub

Design Phone Directory

Description

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class PhoneDirectory {
public:
unordered_map<int, list<int>::iterator > setting;
list<int> lis;
/** Initialize your data structure here
@param maxNumbers - The maximum numbers that can be stored in the phone directory. */
PhoneDirectory(int maxNumbers) {
for (int i = 0; i < maxNumbers; ++i) {
lis.push_back(i);
setting[i] = lis.begin();
}
}

/** Provide a number which is not assigned to anyone.
@return - Return an available number. Return -1 if none is available. */
int get() {
if (lis.empty()) return -1;
int ret = *(lis.begin());
setting.erase(ret);
lis.pop_front();
return ret;
}

/** Check if a number is available or not. */
bool check(int number) {
return setting.find(number) != setting.end();
}

/** Recycle or release a number. */
void release(int number) {
if (setting.count(number) != 0) return;
lis.push_front(number);
setting[number] = lis.begin();
}
};

/**
* Your PhoneDirectory object will be instantiated and called as such:
* PhoneDirectory obj = new PhoneDirectory(maxNumbers);
* int param_1 = obj.get();
* bool param_2 = obj.check(number);
* obj.release(number);
*/