前端培训丁鹿学堂:前端算法面试系列(三)

121 阅读2分钟
队列是什么

一个先进先出的数据结构。它和栈正好是相反的。栈是后进先出。队列是先进先出。 队列比较容易形象的理解。我们排队买东西,就是先排的先买到然后出队。跟程序是一个道理。

JavaScript中也没有队列的数据结构,但是仍然可以用Array去实现队列的所有功能。 push是入队, shift是出队。

const queue = []
queue.push(1)
queue.push(2)
let item1 = queue.shift()
let item2 = queue.shift()

队列的应用场景

面对无法同时处理多个问题的场景,使用先进先出的特性,一个一个解决问题,保证有序性。那么就考虑使用队列。

前端中的js异步任务队列就是典型的队列应用。js是单线程的,无法同时处理异步中的并发任务,就使用了任务队列先后去处理异步任务。

队列经典题目

这是力扣的一个题:

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请你实现 RecentCounter 类:

RecentCounter() 初始化计数器,请求数为 0 。

int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。 保证 每次对 ping 的调用都使用比之前更大的 t 值。

相信很多人看了一遍之后就问:这TM是什么意思?因为这个题目是翻译过来的,所以比较饶。他的意思就是t表示第n毫秒进来一个请求,让你算出3000毫秒内的请求数。

比如第1ms,100ms, 3000ms,进来三个请求,那么3000ms内就是3个请求,3003ms又进来一个,此时1ms进来的已经不在3000ms统计范围内,所以3003ms时候的请求数仍然是3个

代码:

let RecentCounter = function(){
    this.queue = []
}
RecentCounter.prototype.ping = function(t){
    this.queue.push(t)
    while(this.queue[0]<t - 3000){
        this.queue.shift()
    }
    return this.queue.length
}