var RecentCounter = function() {
this.q=[];
};
/**
* @param {number} t
* @return {number}
*/.
RecentCounter.prototype.ping = function(t) {
this.q.push(t);
while(this.q[0]<t-3000)
{
this.q.shift();
}
return this.q.length;
};
/**
* Your RecentCounter object will be instantiated and called as such:
* var obj = new RecentCounter()
* var param_1 = obj.ping(t)
*/
题目的理解:
难以理解的地方哈:
返回从 3000 毫秒前到现在的 ping 数。
意思:现在的请求的毫秒数到之前的3000毫秒之间的数,算是一个范围把。
任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。
意思:现在请求的毫秒数到之前的3000毫秒之间的范围。
保证每次对 ping 的调用都使用比之前更大的 t 值。
意思:是逐渐增大。
问题:
核心思想:
它求的是一个范围,一个现在的请求毫秒数到之前3000毫秒的这个范围内的请求。如果包括了之前的几个请求就有几个请求啊。
while(this.q[0]<t-3000)
{
this.q.shift();
}
t-3000代表现在请求的到之前3000毫秒到请求,这个范围内。
第一个请求1毫秒那一个,大于范围的开始几次的请求的(1-3000=-2999,100-3000=2900,3001-3000=1,3002-3000=2)的话,范围的结束是(1,100,3001,3002)就累加,为什么累加。因为他是范围内的啊
如果第一个毫秒1哪一个,如果小于范围的开始的话,几次的请求的,还有什么好说的啊,踢出去。
为什么是q[0],因为肉眼看出来踢出去的只有1啊.
return this.q.length;
累加。
为什么用队列?
因为是先进先出的啊懂?