基于队列(Queue)的部分笔试题

1. 设计一个循环队列(环形队列)

问题描述: 设计一个支持以下操作的队列:

  • enqueue(int x):将元素 x 添加到队尾。

  • dequeue():移除并返回队头元素。

  • peek():返回队头元素,但不移除它。

  • isFull():判断队列是否已满。

  • isEmpty():判断队列是否为空。

队列的大小为 k,实现一个支持高效操作的循环队列。

思路:

  • 使用数组来实现队列,通过两个指针(frontrear)来记录队头和队尾位置。

  • 循环队列的关键是使用取余操作来避免数组越界。

class CircularQueue {private int front, rear, capacity;private int[] queue;public CircularQueue(int size) {capacity = size;queue = new int[capacity];front = 0;rear = 0;}public void enqueue(int item) {if ((rear + 1) % capacity == front) {System.out.println("Queue is full");return;}queue[rear] = item;rear = (rear + 1) % capacity;}public int dequeue() {if (front == rear) {System.out.println("Queue is empty");return -1;}int item = queue[front];front = (front + 1) % capacity;return item;}public int peek() {if (front == rear) {System.out.println("Queue is empty");return -1;}return queue[front];}public boolean isEmpty() {return front == rear;}public boolean isFull() {return (rear + 1) % capacity == front;}
}

2. 用两个栈实现队列

问题描述: 用两个栈实现一个队列,支持入队和出队操作。要求实现以下接口:

  • enqueue(int x):将元素 x 添加到队列尾部。

  • dequeue():从队列头部移除并返回元素。

思路:

  • 使用两个栈:stack1 用于入队,stack2 用于出队。

  • 每次出队时,将 stack1 中的所有元素倒入 stack2,然后从 stack2 出队。

import java.util.Stack;class QueueWithTwoStacks {private Stack<Integer> stack1 = new Stack<>();private Stack<Integer> stack2 = new Stack<>();public void enqueue(int x) {stack1.push(x);}public int dequeue() {if (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}if (stack2.isEmpty()) {System.out.println("Queue is empty");return -1;}return stack2.pop();}
}

3. 设计一个支持 max 操作的队列

问题描述: 设计一个队列,要求能够在常数时间内支持获取队列中的最大值操作。实现以下接口:

  • enqueue(int x):将元素 x 添加到队列尾部。

  • dequeue():移除并返回队列头部的元素。

  • max():返回队列中的最大值。

思路:

  • 使用一个辅助队列 maxQueue 来维护当前队列中的最大值。当新元素加入时,maxQueue 中只保留大于等于该元素的元素,保证队头始终是当前最大值。

import java.util.LinkedList;class MaxQueue {private LinkedList<Integer> queue = new LinkedList<>();private LinkedList<Integer> maxQueue = new LinkedList<>();public void enqueue(int x) {queue.add(x);while (!maxQueue.isEmpty() && maxQueue.getLast() < x) {maxQueue.removeLast();}maxQueue.add(x);}public int dequeue() {if (queue.isEmpty()) {System.out.println("Queue is empty");return -1;}int val = queue.removeFirst();if (val == maxQueue.getFirst()) {maxQueue.removeFirst();}return val;}public int max() {if (maxQueue.isEmpty()) {System.out.println("Queue is empty");return -1;}return maxQueue.getFirst();}
}

4. 设计一个“按大小排序的队列”

问题描述: 设计一个队列,在入队时,保持队列中所有元素按从大到小的顺序排列。实现以下接口:

  • enqueue(int x):将元素 x 添加到队列,并保持队列按大小顺序排列。

  • dequeue():从队列头部移除并返回元素。

思路:

  • 可以使用一个 PriorityQueue(优先队列),它能在入队时自动保持元素按指定顺序排列。

import java.util.PriorityQueue;class SortedQueue {private PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a); // 按降序排列public void enqueue(int x) {queue.offer(x);}public int dequeue() {if (queue.isEmpty()) {System.out.println("Queue is empty");return -1;}return queue.poll();}
}

5. 设计一个多线程安全的队列

问题描述: 设计一个线程安全的队列,要求支持以下操作:

  • enqueue(int x):将元素 x 添加到队列尾部。

  • dequeue():从队列头部移除并返回元素。

思路:

  • 使用 BlockingQueue 接口及其实现类,如 ArrayBlockingQueueLinkedBlockingQueue,它们提供了线程安全的队列操作。

  • 如果是自定义实现,可以使用 synchronized 关键字来确保线程安全,或者使用 ReentrantLock 来实现更细粒度的锁控制。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;class ThreadSafeQueue {private BlockingQueue<Integer> queue;public ThreadSafeQueue(int capacity) {queue = new ArrayBlockingQueue<>(capacity);}public void enqueue(int x) throws InterruptedException {queue.put(x);}public int dequeue() throws InterruptedException {return queue.take();}
}

6. 队列的逆序打印

问题描述: 给定一个队列,实现一个函数,用队列逆序打印所有元素,但不使用递归或额外的存储空间。

思路:

  • 使用两个队列:queue1 用于存储元素,queue2 用于存储倒序元素。每次从 queue1 出队时,将元素加入 queue2,然后再依次出队 queue2 中的元素。

import java.util.LinkedList;
import java.util.Queue;class ReverseQueue {public void reverseQueue(Queue<Integer> queue) {Queue<Integer> tempQueue = new LinkedList<>();while (!queue.isEmpty()) {tempQueue.add(queue.poll());}while (!tempQueue.isEmpty()) {queue.add(tempQueue.poll());}}
}

7. 队列中的最大值

问题描述: 设计一个支持 insert(x)getMax() 操作的队列。

  • insert(x):将元素 x 插入队列。

  • getMax():返回队列中的最大值。

思路:

  • 使用双端队列(Deque)来实现,其中维护一个递减的队列来存储最大值。

import java.util.Deque;
import java.util.LinkedList;class MaxQueue {private Deque<Integer> queue = new LinkedList<>();private Deque<Integer> maxDeque = new LinkedList<>();public void insert(int x) {queue.offer(x);while (!maxDeque.isEmpty() && maxDeque.getLast() < x) {maxDeque.pollLast();}maxDeque.offer(x);}public int getMax() {if (maxDeque.isEmpty()) {System.out.println("Queue is empty");return -1;}return maxDeque.peek();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35325.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DataSophon集成CMAK KafkaManager

本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件&#xff1a;DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…

go基础总结

最近参加字节跳动后端青训营&#xff0c;技术栈是go。go跟Java还是有些区别的&#xff0c;所以自己做点笔记来总结总结go的基础语法 数据类型 go的数据类型有以下几类&#xff1a; 数值类型&#xff1a;整形分为(u)int8、(u)int16、(u)int32、byte、rune、uintptr…&#xf…

docker环境搭建

目录 环境配置指定docker镜像源 环境配置 使用ubuntu20版本 最好先修改一下镜像源&#xff0c;不然要下20分钟 sudo apt install docker.io还需要装以下这些 sudo apt-get install ca-certificates sudo apt-get install curl sudo apt-get install gnupg sudo apt-get ins…

策略模式实战 - 鸭展

该示例出自著名的《HeadFirst》系列的《HeadFirst设计模式》图书的第一个设计模式。用一个鸭子展览的小应用&#xff0c;一步步揭示了如何引入和使用策略模式将示例改造的完美一些。 文章目录 红头鸭与绿头鸭橡皮鸭和诱饵鸭用接口代替继承组合关系与策略模式 红头鸭与绿头鸭 当…

Java(三)IDE集成环境

Java开发使用的ICE集成环境就是大名鼎鼎的eclipse了。 Eclipse的功能很强大,不止可以用来开发java,还可以用来开发C++、Python、PHP等程序。 Eclipse是免费的,直接去官网下载就好了,官网地址: Eclipse Downloads | The Eclipse Foundation 双击安装,我们会看到如下界…

在阿里云/Linux环境搭建Gitblit服务

在阿里云/Linux环境搭建Gitblit服务 1. 整体描述2. 前期准备3. 安装步骤3.1 下载gitblit3.2 上传gitblit3.3 解压文件3.4 修改文件配置3.5 启动gitblit3.6 安全组配置 4. 总结 1. 整体描述 前段时间买了一个阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽的配置&#x…

MySQL的获取、安装、配置及使用教程

一、获取MySQL 官网地址:https://www.mysql.com MySQL产品:企业版(Enterprise)和社区版(Community)社区版是通过GPL协议授权的开源软件&#xff0c;可以免费使用。企业版是需要收费的商业软件 MySQL版本历史:5.0、5.5、5.6、5.7和8.0(最新版本)两种打包版本:MSI(安装版)和ZI…

故障处理--kuboard无法访问,etcd磁盘空间不足

问题现象&#xff1a; kuboard页面报错 排查过程&#xff1a; 1、查看kuboard是否正常。 2、查看kuboard容器的日志&#xff1a; docker logs -f --tail10 kuboard 大概内容如下&#xff1a; levelerror msg"failed to rotate keys: etcdserver: mvcc: database sp…

前端技术(23) : 聊天页面

来源: GPT生成之后微调 效果图 HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>聊天</t…

海外的bug-hunters,不一样的403bypass

一种绕过403的新技术&#xff0c;跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 &#xff08;访问fsip.svc为403&#xff09; 在经过尝试后&#xff0…

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数&#xff0c;可以帮助我们进行测试&#xff0c;但有时候提供的这些函数并不能满足我们的要求&#xff0c;这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时&#xff0c;有时候需要填入当前的时间&#xff0c;虽然我们可以使用p…

无人设备遥控器之动态调频功能篇

一、动态调频功能概述 动态调频功能是指无人机遥控器能够根据当前环境或用户需求&#xff0c;自动调整无线电信号的频率&#xff0c;以优化通信质量和控制性能。这一功能对于确保无人机在复杂环境中的稳定飞行和精确控制至关重要。 二、动态调频的工作原理 频率选择与调整&am…

Android -- [SelfView] 自定义多行歌词滚动显示器

Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明&#xff1b;* 2. 外部可控制进度变化&#xff1b;* 3. 支持屏幕拖动调节进度&#xff08;回调给外部&#xff09;&#xff1b;效果 歌词文件&#xff08;.lrc&#xff09; 一. 使用…

【知识点】图与图论入门

何为图论 见名知意&#xff0c;图论 (Graph Theory) 就是研究 图 (Graph) 的数学理论和方法。图是一种抽象的数据结构&#xff0c;由 节点 (Node) 和 连接这些节点的 边 (Edge) 组成。图论在计算机科学、网络分析、物流、社会网络分析等领域有广泛的应用。 如下&#xff0c;这…

前海紫荆花广场附近路面的临时停车点

前海紫荆花广场附近路面的临时停车点大概20个的样子 具体在紫荆花广场的侧边&#xff0c;每天都有车停。建议临时应急停。因为虽然没有交警贴罚单&#xff0c;但是还是会被贴违停。 不少车贴如下禁停标志。其实附近桂湾公园就可以免费停车&#xff0c;可能是公园停满了&#xf…

【5G】5G Physical Layer物理层(一)

5G多址接入和物理层与长期演进&#xff08;LTE&#xff09;存在一些差异。在下行方向&#xff0c;5G与LTE相似&#xff0c;依旧采用正交频分多址&#xff08;OFDMA&#xff09;。而在上行方向&#xff0c;5G采用了OFDMA和单载波频分多址&#xff08;SC-FDMA&#xff09;&#x…

rk3576 , android14 , 编译, 卡死,android.bp , ninja

问题&#xff1a;我在 编译 &#xff41;&#xff4e;&#xff44;&#xff52;&#xff4f;&#xff49;&#xff44;&#xff11;&#xff14; 的时候&#xff0c; 卡死再 analysing android.bp 这里 &#xff0c;卡了 3&#xff0c;4 个小时。肯定是有问题的。 如图&…

element-plus的el-tree的双向绑定

el-tree改造了下 可选可取消 有默认值 不包含父级id 默认展开 点击节点也可触发选择 节点内容自定义 <template>{{ childKeys }}<!--default-checked-keys:默认展开值&#xff08;正常来说需要包含父级id的 但是我们后端不要后端id &#xff09;show-checkbox&#x…

如何通过自学成长为一名后端开发工程师?

大家好&#xff0c;我是袁庭新。最近&#xff0c;有星友向我提出了一个很好的问题&#xff1a;如何通过自学成为一名后端开发工程师&#xff1f; 为了解答这个疑问&#xff0c;我特意制作了一个视频来详细分享我的看法和建议。 戳链接&#xff1a;如何通过自学成长为一名后端开…

C++:类和对象(2)

1. 类的默认成员函数&#xff1a; 类的默认成员函数就是用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成6个默认成员函数&#xff08;构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数&a…