Leetcode刷题之 【最近的请求次数】

    科技2022-07-11  100

    1 题目

    写一个 RecentCounter 类来计算特定时间范围内最近的请求。

    请你实现 RecentCounter 类:

    RecentCounter() 初始化计数器,请求数为 0 。 int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。 保证每次对 ping 的调用都使用比之前更大的 t 值。

    示例 1:

    输入: [“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

    提示:

    1 <= t <= 104 保证每次对 ping 的调用都使用比之前更大的 t 值至多调用 ping 方法 104 次

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-of-recent-calls 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2 Java代码

    (1)暴力破解(会超时)

    class RecentCounter{ private List<Integer> count = new ArrayList<>(); public RecentCounter() { } public int ping(int t) { int min = t-3000; int to = 1; for (int i = 0; i < this.count.size(); i++) { if (this.count.get(i) >= min) to++; } this.count.add(t); return to; } }

    (2)使用队列实现

    import java.util.*; public class RecentCounter { private Queue<Integer> count = new LinkedList<>(); public RecentCounter() { } public int ping(int t) { /* 如果队列中的ping值超出时间限制(大于3000毫秒),则将其移除队列 */ while (!this.count.isEmpty() && t-this.count.peek()>3000) this.count.poll(); this.count.add(t); return this.count.size(); } public static void main(String[] args) { RecentCounter recentCounter = new RecentCounter(); System.out.println(recentCounter.ping(1)); System.out.println(recentCounter.ping(100)); System.out.println(recentCounter.ping(3001)); System.out.println(recentCounter.ping(3002)); } }

    Processed: 0.019, SQL: 8