https://www.lintcode.com/problem/1709
写一个 RecentCounter 类来计算最近的请求。
它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。
返回从 3000 毫秒前到现在的 ping 数。
任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。
保证每次对 ping 的调用都使用比之前更大的 t 值
最短时间刷“透”算法面试:《66页算法宝典》.pdf
微信添加【jiuzhang1104】备注【66】领取
每个测试用例最多调用 10000 次 ping。
每个测试用例会使用严格递增的 t 值来调用 ping。
每次调用 ping 都有 1 <= t <= 10^9。
样例
样例 1:
输入:["RecentCounter","ping","ping","ping","ping"],[[],[1],[100],[3001],[3002]]
输出:[null,1,2,3,3]
解释:
请求的事件列表为[1,100,3001,3002]。
1.调用 "RecentCounter" 得到null。
2.调用"ping",时间范围为[0,1],此时有一个请求(t=1)。
3.调用"ping",时间范围为[0,100],此时有两个个请求(t=1,t=100)。
4.调用"ping",时间范围为[1,3001],此时有三个请求(t=1,t=100,t=3001)。
5.调用"ping",时间范围为[2,3002],此时有三个请求(t=100,t=3001,t=3002)。
样例 2:
输入:["RecentCounter","ping","ping","ping"],[[],[100],[5000],[5001]]
输出:[null,1,1,2]
解释:
请求的时间列表是 [100,5000,5001]。
1.调用"RecentCounter" 得到null。
2.调用"ping",时间范围为[0,100],此时有一个请求(t=100)。
3.调用"ping",时间范围为[2000,5000],此时有一个请求(t=5000)。
4.调用"ping",时间范围为[2001,5001],此时有两个请求(t=5000,t=5001)。
题目和例子说的不太直白。比如 RecentCounter 返回null,很迷惑人!
ping的时候先将t tt时刻入队,然后将队首早于t − 3000 t-3000t−3000的时间点poll出来,最后返回队列
class RecentCounter {
LinkedList<Integer> q;
public RecentCounter() {
q = new LinkedList<>();
}
public int ping(int t) {
q.add(t);
while (q.peekFirst() < t-3000){
q.pollFirst();
}
return q.size();
}
}
/**
* Your RecentCounter object will be instantiated and called as such:
* RecentCounter obj = new RecentCounter();
* int param_1 = obj.ping(t);
*/