基于队列(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.mzph.cn/pingmian/63244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot事务手动回滚报错

捕捉异常之后手动标记回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 没有嵌套事务&#xff0c;还是报Transaction rolled back because it has been marked as rollback-only异常错误 查看错误堆栈&#xff0c;service调用的方法外层还套…

Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)

这篇教程的目标是对一个预训练的 Mask R-CNN 模型进行微调,应用于 Penn-Fudan 行人检测与分割数据集。该数据集包含 170 张图像,里面有 345 个行人实例,我们将通过这个教程来演示如何使用 torchvision 中的新特性,训练一个面向自定义数据集的目标检测和实例分割模型。 注意…

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估

文章目录 背景介绍文本分类数据集Lora 微调模型部署与推理期待模型的输出结果 文本分类评估代码 背景介绍 本文将一步一步地&#xff0c;介绍如何使用llamafactory框架利用开源大语言模型完成文本分类的实验&#xff0c;以 LoRA微调 qwen/Qwen2.5-7B-Instruct 为例。 文本分类…

发论文参考文献部分怎么注明数据集出处gitee

见的参考文献标注格式&#xff08;如APA、MLA、Chicago等&#xff09;&#xff0c;电子文献或网络资源的标注通常包括作者&#xff08;或组织&#xff09;、标题、发布年份、获取路径&#xff08;URL&#xff09;等信息。 二、具体步骤 查找数据集信息&#xff1a; 在Gitee上找…

ARM内核与单片机

1.单片机硬件架构如下所示&#xff1a;各种硬件通过总线进行连接。 2.M4内核架构 3.单片机如何工作&#xff1a; 4.CPU是通过读写寄存器来控制GPIO的 5.GPIO的硬件框架&#xff1a;一共有8种模式 &#xff08;1&#xff09;推挽/推挽复用输出。下图先看图1&#xff0c;如果输入…

vue3:mitt

在 Vue 3 中使用 mitt 进行事件总线的实现非常简单。mitt 是一个轻量级的事件库&#xff0c;适用于 Vue 项目中的组件间通信。 实现自定义组件直接相互传值&#xff0c;父到子&#xff0c;子到子&#xff0c;子对子&#xff0c;子对孙&#xff0c;想怎么传就怎么传。和android…

PHP 命令执行漏洞学习记录

PHP 命令执行 命令函数 作用 例子 system() 执行外部程序,并且显示输出 system(whoami) exec() 执行一个外部程序 echo exec(whoami); shell_exec() 通过shell环境执行命令,并且将完整的输出以字符串的形式返回 echo shell_exec(whoami); passthru() 执行外部程序…

VSCode GDB远程嵌入开发板调试

VSCode GDB远程嵌入式开发板调试 一、原理 嵌入式系统中一般在 PC端运行 gdb工具&#xff0c;源码也是在 PC端&#xff0c;源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver&#xff0c;通过网络与 PC端的 gdb进行通信。因此要想在 PC上通过 gdb…

【机器学习】机器学习的基本分类-无监督学习(Unsupervised Learning)

无监督学习&#xff08;Unsupervised Learning&#xff09; 无监督学习是一种机器学习方法&#xff0c;主要用于没有标签的数据集。其目标是从数据中挖掘出潜在的结构和模式。常见的无监督学习任务包括 聚类、降维、密度估计 和 异常检测。 1. 无监督学习的核心目标 1.1 聚类…

【Python]深入Python日志管理:从logging到分布式日志追踪的完整指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 日志是软件开发中的核心部分,尤其在分布式系统中,日志对于调试和问题定位至关重要。本篇文章将从Python标准库的logging模块出发,逐步探讨日志管理的最佳实践,涵盖日志配置、日志分层、日志格式化等基…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

【NLP修炼系列之Bert】Bert多分类多标签文本分类实战(附源码下载)

引言 今天我们就要用Bert做项目实战&#xff0c;实现文本多分类任务和我在实际公司业务中的多标签文本分类任务。通过本篇文章&#xff0c;可以让想实际入手Bert的NLP学习者迅速上手Bert实战项目。 1 项目介绍 本文是Bert文本多分类和多标签文本分类实战&#xff0c;其中多分…

[Redis#17] 主从复制 | 拓扑结构 | 复制原理 | 数据同步 | psync

目录 主从模式 主从复制作用 建立主从复制 主节点信息 从节点信息 断开主从复制关系 主从拓扑结构 主从复制原理 1. 复制过程 2. 数据同步&#xff08;PSYNC&#xff09; 3. 三种复制方式 一、全量复制 二、部分复制 三、实时复制 四、主从复制模式存在的问题 在…

【青牛科技】拥有两个独立的、高增益、内部相位补偿的双运算放大器,可适用于单电源或双电源工作——D4558

概述&#xff1a; D4558内部包括有两个独立的、高增益、内部相位补偿的双运算放大器&#xff0c;可适用于单电源或双电源工作。该电路具有电压增益高、噪声低等特点。主要应用于音频信号放大&#xff0c;有源滤波器等场合。 D4558采用DIP8、SOP8的封装形式 主要特点&#xff…

泰坦军团品牌焕新:LOGO变更开启电竞细分市场新篇章

深圳世纪创新显示电子有限公司旗下的高端电竞显示器品牌泰坦军团&#xff0c;上月发布通告&#xff0c;自2024年6月起已陆续进行品牌升级和LOGO变更。 泰坦军团自2015年成立以来&#xff0c;凭借先进的技术和顶级的工业设计&#xff0c;已成为众多年轻人首选的游戏显示器品牌&…

HALCON 算子 之 阈值分割算子

文章目录 什么是阈值分割&#xff1f;为什么要阈值分割&#xff1f;如何进行阈值分割&#xff1f;全局threshold —— 全局固定阈值分割auto_threshold —— 全局自动阈值分割fast_threshold —— 快速全局阈值分割watersheds_threshold —— 分水岭盆地阈值分割 局部dyn_thres…

【代码随想录|贪心算法重叠区间问题】

452.用最少数量的箭引爆气球 题目链接452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 这道题是要求从下往上穿箭&#xff0c;把所有气球扎爆要的最少箭的数量 思路就是我们比较这个气球和上一个气球有没有重合的&#xff0c;重合我们一根箭一起就射了…

鸿蒙获取 APP 信息及手机信息

前言&#xff1a;获取 APP 版本信息可以通过 bundleManager.getBundleInfoForSelfSync(bundleFlags) 去获取&#xff0c;获取手机信息可以通过 kit.BasicServicesKit 库去获取&#xff0c;以下是封装好的工具类。 import bundleManager from ohos.bundle.bundleManager; impo…

爬取的数据能实时更新吗?

在当今数字化时代&#xff0c;实时数据更新对于企业和个人都至关重要。无论是市场分析、商品类目监控还是其他需要实时数据的应用场景&#xff0c;爬虫技术都能提供有效的解决方案。本文将探讨如何利用PHP爬虫实现数据的实时更新&#xff0c;并提供相应的代码示例。 1. 实时数…

JS中多方式数组复制知识扩展

JS中多方式数组复制知识扩展 前言浅拷贝JavaScript 展开操作符for() 循环其他&#xff1a; array.forEachforEach方法详解 array.mapmap()方法详解 array.filterfilter()方法详解 array.reducereduce()方法详解 array.sliceslice()方法详解 Array.fromArray.from()方法详解 深拷…