[路飞]933. 最近的请求次数

430 阅读2分钟

题目描述

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

请你实现 RecentCounter 类:

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

分析

题目让我们构建一个类,然后还要求实现一个方法。

输出:一个实例,具备能够得到题目要求的方法(筛选 t-3000 范围内的请求数量)

解题思路

题目要求我们在每次请求发出的时候,统计符合传入的 t-3000 范围内的请求数量,实际上如果在传入一个 t 的时候,如果有一个请求不符合时间范围,那么在传入下一个 t' 的时候,他肯定还是不符合要求的,因为他离 t' -3000 会更远。那所以我们可以在每次调用这个 ping 方法的时候,就把不符合要求的请求全部筛选出去,剩下的自然就是符合要求的,如果把他们在一个数组里,直接去返回数组的长度就可以了。

因此我们首先在调用 ping 的时候,把传入的 t 放到队列,进行筛选,shift 掉不符合要求的,最后 return 队列长度,就 OK 了。

代码

var RecentCounter = function () {
  this.queue = []
}

/**
 * @param {number} t
 * @return {number}
 */
RecentCounter.prototype.ping = function (t) {
  this.queue.push(t)

  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)
 */

复杂度

时间:O(N),每次需要遍历队列的长度
空间:O(N),需要存储所有的 t