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

123 阅读2分钟

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