Design Phone Directory

Below is a simple and straightforward implementation of a phone directory as described in the given problem statement.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class PhoneDirectory:

    def __init__(self, maxNumbers: int):
        self.available_numbers = set(range(maxNumbers))
        self.used_numbers = set()

    def get(self) -> int:
        if self.available_numbers:
            number = self.available_numbers.pop()
            self.used_numbers.add(number)
            return number
        return -1

    def check(self, number: int) -> bool:
        return number in self.available_numbers

    def release(self, number: int) -> None:
        if number in self.used_numbers:
            self.used_numbers.remove(number)
            self.available_numbers.add(number)

Explanation:

  1. Initialization (__init__ method): This method initializes the directory with a set of available numbers from 0 to maxNumbers-1 and an empty set of used numbers.

  2. Get a Number (get method): This method provides an available number. If there’s any available number, it removes one from the available set, adds it to the used set, and returns it. If no numbers are available, it returns -1.

  3. Check a Number (check method): This method checks whether a given number is available. If the number is in the available set, it returns True; otherwise, it returns False.

  4. Release a Number (release method): This method recycles a number by removing it from the used set and adding it back to the available set. If the number is not in the used set, this method does nothing.

The solution works in constant time for all operations, and the space complexity is (O(\text{{maxNumbers}})), where (\text{{maxNumbers}}) is the maximum number of slots in the phone directory.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class PhoneDirectory:
    def __init__(self, maxNumbers: int):
        self.available_numbers = set(range(maxNumbers))
        self.maxNumbers = maxNumbers

    def get(self) -> int:
        if self.available_numbers:
            return self.available_numbers.pop()
        else:
            return -1

    def check(self, number: int) -> bool:
        return number in self.available_numbers

    def release(self, number: int) -> None:
        if number < self.maxNumbers and number not in self.available_numbers:
            self.available_numbers.add(number)