Почему очередь лучше всего подходит для определения количества последних вызовов? [Leetcode проблема] - PullRequest
1 голос
/ 20 мая 2019

Я только что поработал над проблемой «Количество последних вызовов» в Leetcode. Я читал, что хотел, чтобы я возвратил количество пингов, но понятия не имел, как это сделать.

Описание здесь:

Напишите класс RecentCounter для подсчета последних запросов.

У него есть только один метод: ping (int t), где t представляет некоторое время в миллисекундах.

Возвращает количество пингов, которые были сделаны за 3000 миллисекунд назад до сих пор.

Будет учитываться любой пинг со временем в [t - 3000, t], включая текущий пинг.

Гарантируется, что каждый вызов ping использует строго большее значение t, чем раньше.

Я узнал, что вы должны немедленно знать, что вам нужно использовать очередь. Я понятия не имел, и просто хотел узнать, может ли кто-нибудь объяснить, почему вам нужно использовать очередь для этой проблемы. Вот одно из решений.

import collections

class recentCounter:
    def __init__(self):
        self.p = collections.deque()

    def ping(self, t: int):
        self.p.append(t)
        while self.p[0] < t - 3000:
            self.p.popleft()
        return len(self.p)

1 Ответ

0 голосов
/ 20 мая 2019

Очередь - это просто подкласс массива, где новые значения append сводятся к низу, а старые значения popleft редактируются сверху.

Вам не нужно абсолютно это решатьтвоя проблема;Вы можете append каждое новое значение массива с отметкой времени, а затем выполнять итерацию по массиву, чтобы возвращать только значения за последние три секунды.Однако очередь намного элегантнее.Это решение сохраняет ваш массив только так долго, как должно быть, а затем не требует дополнительной работы для получения желаемого результата.

...