一、数据结构-队列:
JavaScript中没有队列这个数据结构,但是可以用数组来实现所有的功能。队列是一个先进先出的数据结构,一般JavaScript中采用队列的数据解决问题时会用到进队列:push()、出队列:shift()
# 10天算法挑战(一):数据结构栈之leetcode1047(删除字符串中的所有相邻重复项)中提到栈
栈
:后进先出,入栈:push(),出栈:pop()
任务队列
: 先进先出,进队列:push()、出队列:shift()
任务队列对应javascript中的js执行机制(js事件循环机制event loop)及宏微任务,这里不再赘述。
二、题目解析:
因为题目说到在时间 t
添加一个新请求,其中 t
表示以毫秒为单位的某个时间,并返回过去 3000
毫秒内发生的所有请求数。确切地说,返回在 [t-3000, t]
内发生的请求数。因此这是一个典型的队列:先进先出,因为先发起的请求到时间后就会被剔除。分析大致思路如下:
- 有新请求就入队
- 3000毫秒前的请求出队
- 队列的长度就是最近请求次数
那首先肯定是先建一个队列,这个队列需要在ping方法中被访问。
而且多次调用时访问的都是同一个队列,所以队列应该挂载在构造函数的this上,这样所有的类方法都能访问到(包括ping)
ping方法中实现的就应该是发起请求时将其入队,当不在时间范围内时将之前的请求踢出队,最后返回队列长度即可
三、代码实现:
var RecentCounter = function() {
// 创建一个队列
this.queue=[]
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function(t) {
this.queue.push(t)
while(this.queue[0] < t - 3000){
this.queue.shift()
}
return this.queue.length
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/