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;
累加。 为什么用队列? 因为是先进先出的啊懂?