Design Phone Directory — Available Number Pool

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem

Design a phone directory that manages maxNumbers phone numbers:

  • get() — provide an available number, return -1 if none
  • check(number) — check if number is available
  • release(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

OperationTimeSpace
getO(1)O(N)
checkO(1)O(N)
releaseO(1)O(N)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro