Skip to content

Queue Basics

Table of Contents

933. Number of Recent Calls

950. Reveal Cards In Increasing Order

649. Dota2 Senate

346. Moving Average from Data Stream

346. Moving Average from Data Stream - Python Solution
from collections import deque


# Deque
class MovingAverage:
    def __init__(self, size: int):
        self.q = deque()
        self.cur = 0
        self.sum = 0
        self.size = size

    def next(self, val: int) -> float:
        if self.cur >= self.size:
            self.sum -= self.q.popleft()
            self.cur -= 1

        self.q.append(val)
        self.sum += val
        self.cur += 1

        return self.sum / self.cur


if __name__ == "__main__":
    ma = MovingAverage(3)
    assert ma.next(1) == 1.0
    assert ma.next(10) == 5.5
    assert ma.next(3) == 4.666666666666667
    assert ma.next(5) == 6.0

362. Design Hit Counter

362. Design Hit Counter - Python Solution
from collections import deque


class HitCounter:

    def __init__(self):
        self.hits = deque()

    def hit(self, timestamp: int) -> None:
        self.hits.append(timestamp)

    def getHits(self, timestamp: int) -> int:
        # Remove hits that are older than 5 minutes (300 seconds)
        while self.hits and self.hits[0] <= timestamp - 300:
            self.hits.popleft()
        return len(self.hits)


obj = HitCounter()
obj.hit(1)
obj.hit(2)
obj.hit(3)
print(obj.getHits(4))  # 3
obj.hit(300)
print(obj.getHits(300))  # 4
print(obj.getHits(301))  # 3

379. Design Phone Directory

1429. First Unique Number

1429. First Unique Number - Python Solution
from collections import defaultdict, deque
from typing import List


# Deque
class FirstUnique:

    def __init__(self, nums: List[int]):
        self.all = set()
        self.multi = set()

        for num in nums:
            if num in self.all:
                self.multi.add(num)
            self.all.add(num)

        self.q = deque([i for i in nums if i not in self.multi])

    def showFirstUnique(self) -> int:
        while self.q and self.q[0] in self.multi:
            self.q.popleft()
        return self.q[0] if self.q else -1

    def add(self, value: int) -> None:
        if value not in self.all:
            self.all.add(value)
            self.q.append(value)
        elif value not in self.multi:
            self.multi.add(value)


if __name__ == "__main__":
    nums = [2, 3, 5]
    firstUnique = FirstUnique(nums)
    assert firstUnique.showFirstUnique() == 2
    firstUnique.add(5)
    assert firstUnique.showFirstUnique() == 2
    firstUnique.add(2)
    assert firstUnique.showFirstUnique() == 3
    firstUnique.add(3)
    assert firstUnique.showFirstUnique() == -1

2534. Time Taken to Cross the Door

Comments