加载中...
933-最近的请求次数(Number of Recent Calls)
发表于:2021-12-03 | 分类: 简单
字数统计: 448 | 阅读时长: 2分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/number-of-recent-calls

英文原文

You have a RecentCounter class which counts the number of recent requests within a certain time frame.

Implement the RecentCounter class:

  • RecentCounter() Initializes the counter with zero recent requests.
  • int ping(int t) Adds a new request at time t, where t represents some time in milliseconds, and returns the number of requests that has happened in the past 3000 milliseconds (including the new request). Specifically, return the number of requests that have happened in the inclusive range [t - 3000, t].

It is guaranteed that every call to ping uses a strictly larger value of t than the previous call.

 

Example 1:

Input
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
Output
[null, 1, 2, 3, 3]

Explanation
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1], range is [-2999,1], return 1
recentCounter.ping(100);   // requests = [1, 100], range is [-2900,100], return 2
recentCounter.ping(3001);  // requests = [1, 100, 3001], range is [1,3001], return 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002], range is [2,3002], return 3

 

Constraints:

  • 1 <= t <= 109
  • Each test case will call ping with strictly increasing values of t.
  • At most 104 calls will be made to ping.

中文题目

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请你实现 RecentCounter 类:

  • RecentCounter() 初始化计数器,请求数为 0 。
  • int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。

保证 每次对 ping 的调用都使用比之前更大的 t 值。

 

示例:

输入:
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
输出:
[null, 1, 2, 3, 3]

解释:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1],范围是 [-2999,1],返回 1
recentCounter.ping(100);   // requests = [1, 100],范围是 [-2900,100],返回 2
recentCounter.ping(3001);  // requests = [1, 100, 3001],范围是 [1,3001],返回 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3

 

提示:

  • 1 <= t <= 109
  • 保证每次对 ping 调用所使用的 t 值都 严格递增
  • 至多调用 ping 方法 104

通过代码

官方题解

方法一:队列

我们只会考虑最近 3000 毫秒到现在的 ping 数,因此我们可以使用队列存储这些 ping 的记录。当收到一个时间 tping 时,我们将它加入队列,并且将所有在时间 t - 3000 之前的 ping 移出队列。

[sol1]
class RecentCounter { Queue<Integer> q; public RecentCounter() { q = new LinkedList(); } public int ping(int t) { q.add(t); while (q.peek() < t - 3000) q.poll(); return q.size(); } }
[sol1]
class RecentCounter(object): def __init__(self): self.q = collections.deque() def ping(self, t): self.q.append(t) while self.q[0] < t-3000: self.q.popleft() return len(self.q)

复杂度分析

  • 时间复杂度:$O(Q)$,其中 $Q$ 是 ping 的次数。

  • 空间复杂度:$O(W)$,其中 $W = 3000$ 是队列中最多存储的 ping 的记录数目。

统计信息

通过次数 提交次数 AC比率
38754 53297 72.7%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
932-漂亮数组(Beautiful Array)
下一篇:
934-最短的桥(Shortest Bridge)
本文目录
本文目录