Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么队列是查找最近呼叫数的最佳方法?[Leetcode问题]_Python_Python 3.x_Queue_Python 3.6 - Fatal编程技术网

Python 为什么队列是查找最近呼叫数的最佳方法?[Leetcode问题]

Python 为什么队列是查找最近呼叫数的最佳方法?[Leetcode问题],python,python-3.x,queue,python-3.6,Python,Python 3.x,Queue,Python 3.6,我刚刚解决了Leetcode上的“最近通话次数”问题。我读到它想让我返回ping的数量,但不知道如何去做 详情如下: 编写一个类RecentCounter来计算最近的请求 它只有一个方法:ping(intt),其中t表示以毫秒为单位的时间 返回从3000毫秒前到现在进行的ping数 时间在[t-3000,t]内的任何ping都将计算在内,包括当前ping 可以保证对ping的每次调用都使用比以前严格更大的t值 我了解到,你必须立即知道你需要使用队列。我不知道,只是想知道是否有人可以解释为什么需要

我刚刚解决了Leetcode上的“最近通话次数”问题。我读到它想让我返回ping的数量,但不知道如何去做

详情如下:

编写一个类RecentCounter来计算最近的请求

它只有一个方法:ping(intt),其中t表示以毫秒为单位的时间

返回从3000毫秒前到现在进行的ping数

时间在[t-3000,t]内的任何ping都将计算在内,包括当前ping

可以保证对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)
导入集合
类最近计数器:
定义初始化(自):
self.p=collections.deque()
def ping(自,t:int):
self.p.append(t)
当self.p[0]
队列只是数组的一个子类,其中新值
附加到底部,旧值从顶部开始添加到顶部


你不一定需要这个来解决你的问题;您可以
将每个新值附加到带有时间戳的数组中,然后在数组上迭代以仅返回过去三秒的值。然而,队列要优雅得多。此解决方案只保留数组必须保留的时间,然后不需要额外的工作就可以产生所需的结果。

队列只是数组的一个子类,其中新值将
附加到底部,旧值将从顶部
弹出


你不一定需要这个来解决你的问题;您可以
将每个新值附加到带有时间戳的数组中,然后在数组上迭代以仅返回过去三秒的值。然而,队列要优雅得多。此解决方案只保留数组必须保留的时间,然后不需要额外的工作即可产生所需的结果。

队列不是
数组
的子类(假设您指的是
数组.array
列表
,但它不是这两个类的子类)。此外,它不仅更优雅,而且比这里的列表更有效,因为
.popleft
是带有
deque
对象的恒定时间,而不是带有
list
对象的等价操作的线性时间。你是对的,子类不精确;我指的是队列的概念,“子类型”会更好。重要的是要指出节省时间以及!谢谢大家。因此,它更为优化,但您不必总是使用队列?有一些解决方案不需要队列,但对于这个问题,您绝对应该使用队列。队列不是
array
的子类(假设您指的是
array.array
list
,但它不是这两者的子类)。此外,它不仅更优雅,而且比这里的列表更有效,因为
.popleft
是带有
deque
对象的恒定时间,而不是带有
list
对象的等价操作的线性时间。你是对的,子类不精确;我指的是队列的概念,“子类型”会更好。重要的是要指出节省时间以及!谢谢大家。这样做的好处是它更为优化,但您不必总是使用队列?有些解决方案不需要队列,但对于这个问题,您绝对应该使用队列。您不必使用
deque
,但
deque
具有恒定的时间
popleft
操作,哪一个比等价的
my_list.pop(0)
更有效?它是
列表
对象上的线性时间。您不必使用
deque
,但是
deque
具有恒定的时间
popleft
操作,这比等价的
my_list.pop(0)更有效
这将是
列表
对象上的线性时间