Loading [MathJax]/jax/output/CommonHTML/jax.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >最近,又开始连续有大厂员工猝死消息了

最近,又开始连续有大厂员工猝死消息了

作者头像
宫水三叶的刷题日记
发布于 2024-06-26 01:35:06
发布于 2024-06-26 01:35:06
15500
代码可运行
举报
运行总次数:0
代码可运行

来一道和「设计数据结构」高度相关的题目。

题目描述

平台:LeetCode

题号:622

设计你的循环队列实现。

循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环,它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。

在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。

但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为

  • Front: 从队首获取元素。如果队列为空,返回

  • Rear: 获取队尾元素。如果队列为空,返回

  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

  • 所有的值都在

的范围内;

  • 操作数将在

的范围内;

  • 请不要使用内置的队列库。

数据结构

创建一个长度为

的数组充当循环队列,使用两个变量 heta 来充当队列头和队列尾(起始均为

),整个过程 he 始终指向队列头部,ta 始终指向队列尾部的下一位置(待插入元素位置)。

两变量始终自增,通过与

取模来确定实际位置。

分析各类操作的基本逻辑:

  • isEmpty 操作:当 heta 相等,队列存入元素和取出元素的次数相同,此时队列为空;
  • isFull 操作:ta - he 即队列元素个数,当元素个数为

个时,队列已满;

  • enQueue 操作:若队列已满,返回

,否则在 nums[ta % k] 位置存入目标值,并将 ta 指针后移;

  • deQueue 操作:若队列为空,返回

,否则将 he 指针后移,含义为弹出队列头部元素;

  • Front 操作:若队列为空,返回

,否则返回 nums[he % k] 队头元素;

  • Rear 操作:若队列为空,返回

,否则返回 nums[(ta - 1) % k] 队尾元素;

Java 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyCircularQueue {
    int k, he, ta;
    int[] nums;
    public MyCircularQueue(int _k) {
        k = _k;
        nums = new int[k];
    }
    public boolean enQueue(int value) {
        if (isFull()) return false;
        nums[ta % k] = value;
        return ++ta >= 0;
    }
    public boolean deQueue() {
        if (isEmpty()) return false;
        return ++he >= 0;
    }
    public int Front() {
        return isEmpty() ? -1 : nums[he % k];
    }
    public int Rear() {
        return isEmpty() ? -1 : nums[(ta - 1) % k];
    }
    public boolean isEmpty() {
        return he == ta;
    }
    public boolean isFull() {
        return ta - he == k;
    }
}

C++ 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyCircularQueue {
public:
    int k, he, ta;
    vector<int> nums;
    MyCircularQueue(int _k) {
        k = _k;
        he = ta = 0;
        nums.resize(k);
    }
    bool enQueue(int value) {
        if (isFull()) return false;
        nums[ta % k] = value;
        return ++ta >= 0;
    }
    bool deQueue() {
        if (isEmpty()) return false;
        return ++he >= 0;
    }
    int Front() {
        return isEmpty() ? -1 : nums[he % k];
    }
    int Rear() {
        return isEmpty() ? -1 : nums[(ta - 1) % k];
    }
    bool isEmpty() {
        return he == ta;
    }
    bool isFull() {
        return ta - he == k;
    }
};

Python 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyCircularQueue:
    def __init__(self, _k):
        self.k = _k
        self.he = self.ta = 0
        self.nums = [0] * _k

    def enQueue(self, value):
        if self.isFull(): return False
        self.nums[self.ta % self.k] = value
        self.ta += 1
        return self.ta >= 0

    def deQueue(self):
        if self.isEmpty(): return False
        self.he += 1
        return self.he >= 0

    def Front(self):
        return -1 if self.isEmpty() else self.nums[self.he % self.k]

    def Rear(self):
        return -1 if self.isEmpty() else self.nums[(self.ta - 1) % self.k]

    def isEmpty(self):
        return self.he == self.ta

    def isFull(self):
        return self.ta - self.he == self.k

TypeScript 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyCircularQueue {
    k: number = 0; he: number = 0; ta: number = 0;
    nums: number[];
    constructor(k: number) {
        this.k = k
        this.nums = new Array<number>(this.k)
    }
    enQueue(value: number): boolean {
        if (this.isFull()) return false
        this.nums[this.ta % this.k] = value
        return this.ta++ >= 0
    }
    deQueue(): boolean {
        if (this.isEmpty()) return false
        return this.he++ >= 0
    }
    Front(): number {
        return this.isEmpty() ? -1 : this.nums[this.he % this.k]
    }
    Rear(): number {
        return this.isEmpty() ? -1 : this.nums[(this.ta - 1) % this.k]
    }
    isEmpty(): boolean {
        return this.he == this.ta
    }
    isFull(): boolean {
        return this.ta - this.he == this.k
    }
}
  • 时间复杂度:构造函数复杂度为

,其余操作复杂度为

  • 空间复杂度:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宫水三叶的刷题日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​LeetCode 622:设计循环队列 Design Circular Queue
如上图所示,队列是典型的 FIFO 数据结构。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾。删除(delete)操作也被称为出队(dequeue)。你只能移除第一个元素。
爱写bug
2019/08/01
7250
​LeetCode 622:设计循环队列 Design Circular Queue
622. 设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
Michel_Rolle
2023/11/09
3.3K2
「LeetCode」622. 设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
Maynor
2021/12/07
2020
「LeetCode」622. 设计循环队列
LeetCode 622. 设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。 它也被称为“环形缓冲器”。
Michael阿明
2020/07/13
5500
图解LeetCode——622. 设计循环队列(难度:中等)
设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
爪哇缪斯
2023/05/10
1850
图解LeetCode——622. 设计循环队列(难度:中等)
用javascript分类刷leetcode18.队列(图文视频讲解)1
队列的特点:先进先出(FIFO)队列的时间复杂度:入队和出队O(1),查找O(n)优先队列:priorityQueue,按优先级出队,实现 Heap(Binary,Fibonacci...)js里没有队列,但是可以用数组模拟图片347. 前 K 个高频元素 (medium)给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = 1,1,1,2,2,3, k = 2输出: 1,2示例 2:输入: nums = 1, k
hellocoder2028
2023/01/03
7990
设计循环队列(leetcode 622)
循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为环形缓冲器(Ringr Buffer)。
恋喵大鲤鱼
2022/09/27
4930
设计循环队列(leetcode 622)
循环队列
法1:用到的是我之前写的循环队列文章里面的方法 循环队列详解 #include<iostream> using namespace std; class MyCircularQueue { private: int queue[1000]; int head; int tail; int size; public: MyCircularQueue(int k) { size = k+1; head =
大忽悠爱学习
2022/05/05
3040
循环队列
数据结构——循环队列
循环队列的实现需要一个定长数组arr,一个头指针head,一个尾指针rear,还有用于记录数据个数的变量k。
HZzzzzLu
2024/11/26
2910
数据结构——循环队列
【Leetcode】设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
P_M_P
2024/01/18
1630
【Leetcode】设计循环队列
手把手设计C语言版循环队列(力扣622:设计循环队列)
队列会出现“假溢出”现象,即队列的空间有限,队列是在头和尾进行操作的,当元素个数已经达到最大个数时,队尾已经在空间的最后面了,但是对头前面的不一定是满的。针对这一现象,引入了循环队列。循环队列也是一种数据结构,小编在本篇文章中,是以力扣的一道题目为例来设计循环队列。
南桥
2024/01/26
3080
手把手设计C语言版循环队列(力扣622:设计循环队列)
从小工到专家:设计循环队列
循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”
早起的鸟儿有虫吃
2021/03/04
5010
设计循环队列
简单记录一下思路: 1, 队列为空状态:head = tail = -1; 2, 入队:如果入队前是空的,则将head 和 tail 都向右移一位,也就是下标为0的地方; 否则只需右移tail 3, 出队:如果出队时队列不为空且为最后一个元素(head == tail),则置head = tail = -1, 否则只需右移head 4, 取队首:只要队不为空,head指向队首元素 5, 取对尾:同理,tail指向队尾元素 6, 判空:见1 7, 判满:tail右移发现与head重合了,则没有地方放入新的元素了,此时为满
Laikee
2022/04/25
2010
设计循环队列
美团一面:循环队列听说过么,怎么实现?
为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以这里引入了队头和队尾两个指针,假设 front 指针指向队头元素,rear 指针指向队尾元素的下一个位置,这样:
飞天小牛肉
2023/09/19
2930
美团一面:循环队列听说过么,怎么实现?
【数据结构】循环队列
你想想,如果你今天去教室上课,因为是水课,后面3排都坐满了人,而前排还有很多空位,你会怎么做?直接走出教室,并告诉自己后面没有座位可坐了?
修修修也
2024/04/01
1990
【数据结构】循环队列
栈和队列专项练习
为满时: 此时需要考虑空间的问题, 1.若只取k个空间 需要进入数据时,tail被赋值,tail向后移一个,当最后一块空间被赋值时,tail回到下标为0的数组中, 此时tail ==front与判断空的条件相同 ,所以不成立。
lovevivi
2022/11/10
3180
栈和队列专项练习
【数据结构题目】循环队列,以及队列实现栈的模拟
循环队列,顾名思义就是数组组成了一个圈,开始时队数组的头索引和为索引都在一个位置下。
用户11288949
2024/09/24
1400
【数据结构题目】循环队列,以及队列实现栈的模拟
什么?要求设计一个循环队列?
介绍: 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
初阶牛
2023/10/14
2750
什么?要求设计一个循环队列?
深入了解队列数据结构:定义、特性和实际应用
队列是一种线性数据结构,它遵循“先进先出”(First-In-First-Out,FIFO)的原则。这意味着最先进入队列的元素将首先被移出队列,而最后进入队列的元素将最后被移出。队列通常支持以下两个主要操作:
小馒头学Python
2023/11/27
6020
深入了解队列数据结构:定义、特性和实际应用
【Java数据结构】详解Stack与Queue(三)
常用的方法为以上三个方法,但总共有六个方法。 🍓入队列:add()、offer() 相同:未超出容量,从队尾压入元素,返回压入的那个元素。 区别:在超出容量时,add()方法会对抛出异常,offer()返回false 🍓出队列:remove()、poll() 相同:容量大于0的时候,删除并返回队头被删除的那个元素。 区别:在容量为0的时候,remove()会抛出异常,poll()返回null 🍓获取队头元素(不删除):element()、peek() 相同:容量大于0的时候,都返回队头元素。但是不删除。 区别:容量为0的时候,element()会抛出异常,peek()返回null。 虽然有六个方法,但我们经常用的是 offer(),poll(),peek()。知道这另外三个方法就行了 此外我们还需记住size()和isEmpty(),这两个方法之前就见过,想必不用多说了。
E绵绵
2024/06/05
1470
【Java数据结构】详解Stack与Queue(三)
相关推荐
​LeetCode 622:设计循环队列 Design Circular Queue
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档