Design Phone Directory

medium design hash set queue

Problem

Design a phone directory supporting get() (any free number), check(num) (is it free?), release(num).

Inputn=3; get() = 0; get() = 1; check(2) = true; get() = 2; check(2) = false; release(2); check(2) = true
Output[0,1,true,2,false,true]
Internal state: free queue and used set track numbers in O(1) ops.

from collections import deque
class PhoneDirectory:
    def __init__(self, n):
        self.free = deque(range(n))
        self.used = set()
    def get(self):
        if not self.free: return -1
        x = self.free.popleft()
        self.used.add(x)
        return x
    def check(self, x):
        return x not in self.used
    def release(self, x):
        if x in self.used:
            self.used.discard(x)
            self.free.append(x)
class PhoneDirectory {
  constructor(n) {
    this.free = [];
    for (let i = 0; i < n; i++) this.free.push(i);
    this.used = new Set();
  }
  get() {
    if (!this.free.length) return -1;
    const x = this.free.shift();
    this.used.add(x);
    return x;
  }
  check(x) { return !this.used.has(x); }
  release(x) {
    if (this.used.has(x)) { this.used.delete(x); this.free.push(x); }
  }
}
class PhoneDirectory {
    Deque free = new ArrayDeque<>();
    Set used = new HashSet<>();
    public PhoneDirectory(int n) {
        for (int i = 0; i < n; i++) free.add(i);
    }
    public int get() {
        if (free.isEmpty()) return -1;
        int x = free.poll(); used.add(x); return x;
    }
    public boolean check(int x) { return !used.contains(x); }
    public void release(int x) {
        if (used.remove(x)) free.add(x);
    }
}
class PhoneDirectory {
    queue freeQ;
    unordered_set used;
public:
    PhoneDirectory(int n) { for (int i = 0; i < n; i++) freeQ.push(i); }
    int get() {
        if (freeQ.empty()) return -1;
        int x = freeQ.front(); freeQ.pop(); used.insert(x); return x;
    }
    bool check(int x) { return !used.count(x); }
    void release(int x) {
        if (used.erase(x)) freeQ.push(x);
    }
};
Time: O(1) per op Space: O(n)