写一个 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
截止今日已经刷了一些题,难点处理解题思路就是对题目的理解,有可能是我自己蠢,总是很难理解题目, 所以以后会更多的记录一下题目的理解
其实就是维护一个数组或者链表,每次传入的是毫秒数,一最后一个节点为最后时间,要返回3000毫秒以内的就是item,[1, 100, 3001, 3002] 就是位于2-3002之间的item
function Node(val,next){
this.val = val != undefined ? val : null;
this.next = next != undefined ? next : null;
}
class RecentCounter {
constructor() {
this.list = new Node(-1);
this.endNode=this.list
this.size=0
}
/**
* @param {number} t
* @return {number}
*/
ping(t) {
this.endNode.next=new Node(t);
//因为是链表实现的,考虑到性能,将不在范围之内的删除掉。数组的话不删掉,对性能不会有太大的影响,除非数据比较复杂,
this.endNode=this.endNode.next
this.size++;
let cur=this.list.next
let min=t-3000
while(cur&&cur.val<min){
this.size--
cur=cur.next
}
this.list.next=cur
console.log(this.size)
return this.size
}
}