lintcode 1709 · 最近的请求次数 【simple】

题目

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" 得到null2.调用"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" 得到null2.调用"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);
 */

你可能感兴趣的:(算法)