算法_最近的请求次数 (#933)

127 阅读2分钟

前言

这次这个题目属于比较简单,可使用队列去做,至于队列相关的基础知识,比如什么是队列,队列的基本语法之类的,我准备后面会整理一篇文章,因为我也是最近才了解队列;
好了,进入主题啦。。。。。。

题目

大概题意:

给一个时间,在这个时间的过去3000毫秒内,一共有几次请求。

如果给的时间是t, 那么在[t - 3000, t]这个区间内一共有几次请求。

image.png

分析一波

每次传进来的时间,要看它在这时间过去的3000毫秒内,有几次请求?
其实就是看一下传进来这个时间时,之前传进来的那些时间是否有超时的;
只需要把之前进来的那些时间,与新传进来的时间相减,值大于3000毫秒的话,
那么就把之前的那个时间值删除,继续这种操作; 最后返回积累值的长度就可以了;

怎么做?

每次传进来一个t值,就直接添加到链表或者数组的尾部,
然后去对比一下数组或者链表里头部开始比较哪些元素超过了3000毫秒,
也就是超过了[t - 3000, t]这个区间,就pop出去。

实践,上代码分析

var RecentCounter = function() {
this.queue = new Queue();
};
/** 
 * @param {number} t
 * @return {number}
 */  
RecentCounter.prototype.ping = function(t) {  
    this.queue.enqueue(t);
    while((t-this.queue.front())>3000) this.queue.dequeue();  
    return this.queue.size();

};

此题目中用的是队列;
先new一个队列;
在方法里把传进来的时间添加到队列的尾部;用enqueue();
然后使用一个循环去判断队列的头部是否有与传进来的t相减大于3000的元素,
有的话就直接删除掉,
直到此次传进来t值后,队列头部没有超过3000毫秒的元素为止;
最后返回队列的长度就可以了;