933. 最近的请求次数
写一个
RecentCounter
类来计算最近的请求。它只有一个方法:
ping(int t)
,其中t
代表以毫秒为单位的某个时间。返回从 3000 毫秒前到现在的
ping
数。任何处于
[t - 3000, t]
时间范围之内的ping
都将会被计算在内,包括当前(指t
时刻)的ping
。保证每次对
ping
的调用都使用比之前更大的t
值。
示例:
输入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]] 输出:[null,1,2,3,3]
提示:
- 每个测试用例最多调用
10000
次ping
。- 每个测试用例会使用严格递增的
t
值来调用ping
。- 每次调用
ping
都有1 <= t <= 10^9
。
解法一
class RecentCounter {
public:
RecentCounter() {}
int ping(int t) {
rec.push(t);
int start = t - 3000;
while(rec.front() < start) rec.pop();
return rec.size();
}
private:
queue<int> rec;
};
/**
* Your RecentCounter object will be instantiated and called as such:
* RecentCounter* obj = new RecentCounter();
* int param_1 = obj->ping(t);
*/
思路:
由于时间是递增的,我们关注的时间点限制在3000ms以内,这类似一个滑动窗口,一边进另一边出,很自然地想到用队列。
ping调用时,先将当前t入队,再反复检查队头与t是否相距在3000ms以内,若不是就出队;直到队头元素与t相距在3000ms以内,此时返回队列的长度即可。
2019/08/12 23:43