数据结构——队列

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

请你实现 RecentCounter 类:

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

 

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-recent-calls

老实说题目看了好几遍,就是没看明白,但是在看了几遍示例后,总算看明白了!!
其实就是这样:每次ping一下,就先入栈,然后再把该时刻3000ms内的数据出栈.

于是我的解法:

class RecentCounter {
  constructor() {
    this.queue = [];
  }
  queue: number[] = [];

  ping(t: number): number {
    let index = 0;
    this.queue.push(t);

    this.queue.forEach((i) => {
      if (i >= t - 3000) {
        ++index;
      }
    });
    return index;
  }
}

值得注意的是,这样的写法其实并不符合队列的,先进先出,因为我们的数组一直在入栈,并没有出,
于是再读一下题:保证 每次对 ping 的调用都使用比之前更大的 t 值。
如果我们在入栈的同时,将不符合该时刻的元素出栈,那么就是队列了,于是我尝试在else部分调用this.queue.shift(),但是测试输出是错误的[null, 1, 2, 2, 2],这个是为啥呢,因为shift会修改数组的长度,导致遍历出错,除非我们先深copy一下数组queue。。。。
但是我师父说**算法就是解决问题的方法 做对了就OK ** 那就这样吧,hhh!