写一个 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!