需要注意的是:本来这题应该使用队列去实现(FIFO),甚至为了节省内存,可以使用循环队列。但是js中没有相关概念,如果去封装一个类似队列的数据,是需要在数组的基础上去操作的,但那样的效率应该没有直接去操作数组高。所以直接操作数组。
这道题思路也很简单:
-
- 在
ping的时候,先将t推到队尾
- 在
-
- 然后计算
t - 3000,即之前有效ping的最小时间,然后从队首开始与这个值作比较,
- 如果比该值小,就将其从队列里推出(shift之后),继续比较新队首是否符合条件
- 只要比该值大,立刻推出比较循环
- 然后计算
-
- 当前数组的长度就是特定时间范围内最近的请求
class RecentCounter {
public queue: number[]
constructor() {
this.queue = []
}
ping(t: number): number {
this.queue.push(t)
while(this.queue[0] < (t - 3000)) {
this.queue.shift()
}
return this.queue.length
}
}