First Unique Number

medium queue hash map design

Problem

Design a data structure over a stream of integers that supports two operations. add(value) appends a number to the stream, and showFirstUnique() returns the first number that has appeared exactly once so far, in the order it arrived. If every number seen so far is a duplicate (or the stream is empty), return -1.

Inputinitial = [2, 3, 5], then add(5), add(2), add(3)
Output2, 2, 3, -1
After [2, 3, 5] the first unique is 2. add(5) makes 5 a duplicate but 2 is still unique → 2. add(2) makes 2 a duplicate, so the first unique becomes 3. add(3) makes 3 a duplicate too; nothing is unique → -1.

class FirstUnique:
    def __init__(self, nums):
        self.count = {}
        self.queue = deque()
        for x in nums:
            self.add(x)

    def add(self, value):
        self.count[value] = self.count.get(value, 0) + 1
        if self.count[value] == 1:
            self.queue.append(value)

    def show_first_unique(self):
        while self.queue and self.count[self.queue[0]] > 1:
            self.queue.popleft()
        return self.queue[0] if self.queue else -1
class FirstUnique {
  constructor(nums) {
    this.count = new Map();
    this.queue = [];
    for (const x of nums) this.add(x);
  }

  add(value) {
    this.count.set(value, (this.count.get(value) || 0) + 1);
    if (this.count.get(value) === 1) this.queue.push(value);
  }

  showFirstUnique() {
    while (this.queue.length && this.count.get(this.queue[0]) > 1)
      this.queue.shift();
    return this.queue.length ? this.queue[0] : -1;
  }
}
class FirstUnique {
    Map<Integer, Integer> count = new HashMap<>();
    Deque<Integer> queue = new ArrayDeque<>();

    public FirstUnique(int[] nums) {
        for (int x : nums) add(x);
    }

    public void add(int value) {
        count.put(value, count.getOrDefault(value, 0) + 1);
        if (count.get(value) == 1) queue.addLast(value);
    }

    public int showFirstUnique() {
        while (!queue.isEmpty() && count.get(queue.peekFirst()) > 1)
            queue.pollFirst();
        return queue.isEmpty() ? -1 : queue.peekFirst();
    }
}
class FirstUnique {
    unordered_map<int, int> count;
    deque<int> queue;
public:
    FirstUnique(vector<int>& nums) {
        for (int x : nums) add(x);
    }

    void add(int value) {
        count[value]++;
        if (count[value] == 1) queue.push_back(value);
    }

    int showFirstUnique() {
        while (!queue.empty() && count[queue.front()] > 1)
            queue.pop_front();
        return queue.empty() ? -1 : queue.front();
    }
};
Time: O(1) amortized per operation Space: O(n)