题目
(1)写一个 RecentCounter 类来计算特定时间范围内最近的请求。
(2)请你实现 RecentCounter 类:
- RecentCounter() 初始化计数器,初始化请求数为 0 。
- int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
- 保证每次对 ping 的调用都使用比之前更大的 t 值。
(3)示例如下所示:
输入:
[“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
解决思路
- 使用队列解决。
- 将调用ping(int t)函数时的值 t 从队列尾部插入队列。
- 然后比较 t 与队列头节点元素值之差是否大于3000,如果差值大于3000则删除头结点,如果差值小于等于3000,则不做任何操作。
- 重复上一步,直到 t 与队列头结点的值之差不大于3000。
- 最后返回队列中元素的个数。
代码
- C++代码
# include <stdio.h>
# include <queue>
using namespace std;
class RecentCounter {
public:
queue<int> q;
RecentCounter() {}
int ping(int t) {
q.push(t);
// 当t与队列头节点的差值大于3000时,就删除头节点
while (t - q.front() > 3000) {
q.pop();
}
return q.size();
}
};
int main() {
RecentCounter *ret = new RecentCounter();
printf("%d\n", ret->ping(1));
printf("%d\n", ret->ping(100));
printf("%d\n", ret->ping(3001));
printf("%d\n", ret->ping(3002));
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
class RecentCounter:
def __init__(self):
self.queue = list()
def ping(self, t: int) -> int:
self.queue.append(t)
# 当t与队列头节点的差值大于3000时,就删除头节点
while t - self.queue[0] > 3000:
self.queue.pop(0)
return len(self.queue)
def main():
ret: RecentCounter = RecentCounter()
print(ret.ping(1))
print(ret.ping(100))
print(ret.ping(3001))
print(ret.ping(3002))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第933题。
- 链接:https://leetcode-cn.com/problems/number-of-recent-calls/