LeetCode 933. 最近的请求次数 中等
题目描述
写一个 RecentCounter
类来计算最近的请求。
它只有一个方法:ping(int t)
,其中 t 代表以毫秒为单位的某个时间。
返回从 3000
毫秒前到现在的 ping 数。
任何处于[t - 3000, t]
时间范围之内的 ping
都将会被计算在内,包括当前(指 t 时刻)的 ping
。
保证每次对 ping
的调用都使用比之前更大的 t 值。
示例:
javascript
输入:
["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
提示:
每个测试用例最多调用10000
次 ping。每个测试用例会使用严格递增的 t
值来调用 ping
。每次调用 ping 都有 1 <= t <= 10^9
。
题解
根据样例,发现越早发出的请求越早不在 3000ms
内的请求里
满足先进先出,考虑用队列
那么就将新请求加入队列,3000ms
前发出的请求就出队列
队列的长度即为最近请求次数。
javascript
var RecentCounter = function () {
this.queue = [];
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function (t) {
// 将新请求加入队列
this.queue.push(t);
// 3000ms 前发出的请求就出队列
while (this.queue[0] < t - 3000) {
this.queue.shift();
}
return this.queue.length;
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/
cpp
class RecentCounter {
public:
RecentCounter() {
}
int ping(int t) {
q.push(t);
while(q.front() < t - 3000) {
q.pop();
}
return q.size();
}
private:
queue<int> q;
};
java
class RecentCounter {
Queue<Integer> q;
public RecentCounter() {
q = new LinkedList<>();
}
public int ping(int t) {
q.offer(t);
while(q.peek() < t - 3000) {
q.poll();
}
return q.size();
}
}
python
class RecentCounter:
def __init__(self):
self.q = []
def ping(self, t: int) -> int:
self.q.append(t)
while self.q[0] < t - 3000:
self.q.pop(0)
return len(self.q)
javascript
学如逆水行舟,不进则退