【五月集训】第十六天打卡(队列)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


933. 最近的请求次数

题目链接

最近的请求次数

思路

判断队首元素是否小于t-3000,小于则继续迭代,直到不满足条件,返回队列长度

题解

class RecentCounter {
    queue = []
    constructor() {

    }

    ping(t: number): number {
        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)
 */

2073. 买票需要的时间

题目链接

买票需要的时间

思路

  • 不断模拟出队和入队
  • 出队的元素票数若为空,判断编号是否为k,是则返回用去的时间,不是继续入队

题解

function timeRequiredToBuy(tickets: number[], k: number): number {
    let i: number, t = 0, front = 0, rear = 0
    let data = new Array(20000).fill(0)
    for (i = 0; i < tickets.length; i++) {
        let a: any = {}
        a.pos = i
        a.ticket = tickets[i]
        data[rear++] = a
    }
    while (front < rear) {
        let p = data[front++]
        t++
        --p.ticket
        if (p.ticket == 0) {
            if (p.pos == k) return t
        } else {
            data[rear++] = p
        }
    }
    return -1
};

641. 设计循环双端队列

题目链接

设计循环双端队列

思路

忽略循环二字,没错就是设计双端队列

题解

class MyCircularDeque {
    data: number[]
    head: number
    tatil: number
    count: number
    constructor(k: number) {
        this.data = new Array(k)
        this.head = 0
        this.tatil = 0
        this.count = 0
    }

    /** 头插 */
    insertFront(value: number): boolean {
        if (this.isFull()) return false
        this.head = this.head - 1
        if (this.head < 0) this.head = this.data.length - 1
        this.data[this.head] = value
        this.count += 1
        return true
    }

    /** 尾插 */
    insertLast(value: number): boolean {
        if (this.isFull()) return false
        this.data[this.tatil] = value
        this.tatil = (this.tatil + 1) % this.data.length
        this.count += 1
        return true

    }

    /** 头删 */
    deleteFront(): boolean {
        if (this.isEmpty()) return false
        this.head = (this.head + 1) % this.data.length
        this.count -= 1
        return true
    }

    /** 尾删 */
    deleteLast(): boolean {
        if (this.isEmpty()) return false
        this.tatil = (this.tatil - 1 + this.data.length) % this.data.length
        this.count -= 1
        return true
    }

    /** 返回头部元素 */
    getFront(): number {
        if (this.isEmpty()) return -1
        return this.data[this.head]
    }

    /** 返回尾部元素 */
    getRear(): number {
        if (this.isEmpty()) return -1
        return this.data[(this.tatil - 1 + this.data.length) % this.data.length]
    }

    /** 判断队列是否为空 */
    isEmpty(): boolean {
        return this.count==0
    }

    /** 判断队列是否满了 */
    isFull(): boolean {
        return this.count == this.data.length
    }
}

/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * var obj = new MyCircularDeque(k)
 * var param_1 = obj.insertFront(value)
 * var param_2 = obj.insertLast(value)
 * var param_3 = obj.deleteFront()
 * var param_4 = obj.deleteLast()
 * var param_5 = obj.getFront()
 * var param_6 = obj.getRear()
 * var param_7 = obj.isEmpty()
 * var param_8 = obj.isFull()
 */
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值