Design Phone Directory — Available Number Pool
Advertisement
Problem
Design a phone directory that manages maxNumbers phone numbers:
get()— provide an available number, return -1 if nonecheck(number)— check if number is availablerelease(number)— recycle a number back to the pool
Solutions
Python
from collections import deque
class PhoneDirectory:
def __init__(self, maxNumbers: int):
self.available = deque(range(maxNumbers))
self.in_use = set()
def get(self) -> int:
if not self.available:
return -1
num = self.available.popleft()
self.in_use.add(num)
return num
def check(self, number: int) -> bool:
return number not in self.in_use
def release(self, number: int) -> None:
if number in self.in_use:
self.in_use.remove(number)
self.available.append(number)
JavaScript
class PhoneDirectory {
constructor(maxNumbers) {
this.free = new Set([...Array(maxNumbers).keys()]);
this.iter = this.free.values();
}
get() {
if (this.free.size === 0) return -1;
const num = this.free.values().next().value;
this.free.delete(num); return num;
}
check(n) { return this.free.has(n); }
release(n) { this.free.add(n); }
}
Java
import java.util.*;
class PhoneDirectory {
Queue<Integer> q = new LinkedList<>();
boolean[] used;
public PhoneDirectory(int max) {
used = new boolean[max];
for (int i=0;i<max;i++) q.offer(i);
}
public int get() { if (q.isEmpty()) return -1; int n=q.poll(); used[n]=true; return n; }
public boolean check(int n) { return !used[n]; }
public void release(int n) { if (used[n]) { used[n]=false; q.offer(n); } }
}
C++
#include <queue>
#include <vector>
using namespace std;
class PhoneDirectory {
queue<int> q; vector<bool> used;
public:
PhoneDirectory(int max): used(max,false) { for(int i=0;i<max;i++) q.push(i); }
int get() { if(q.empty()) return -1; int n=q.front(); q.pop(); used[n]=true; return n; }
bool check(int n) { return !used[n]; }
void release(int n) { if(used[n]){ used[n]=false; q.push(n); } }
};
C
int used[1000001] = {0};
int free_pool[1000001]; int head=0, tail=0;
void init(int max) { for(int i=0;i<max;i++) free_pool[tail++]=i; }
int get() { if(head==tail) return -1; int n=free_pool[head++]; used[n]=1; return n; }
int check(int n) { return !used[n]; }
void release(int n) { if(used[n]){ used[n]=0; free_pool[tail++]=n; } }
Complexity
| Operation | Time | Space |
|---|---|---|
| get | O(1) | O(N) |
| check | O(1) | O(N) |
| release | O(1) | O(N) |
Advertisement