编程竞赛-消息存取

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

GitHub - September26/java-algorithms: 算法题汇总,包含牛客,leetCode,lintCode等网站题目的解法和代码,以及完整的mode类,甚至链表代码生成工具都有提供。

原题链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

牛牛拥有一个消息队列,容量无限,为了检测其高效性,特意做了 n\mathit nn 次操作,指令如下:

首先输入一个字符串表示操作种类,如果字符串为 "in",说明此操作为存消息,接着输入一个正整数 t\mathit tt 以及一个非空且仅由小写字母构成的字符串 s\mathit ss,表示将类型为 t\mathit tt 的消息 s\mathit ss 存入消息队列的末尾;
如果最先输入的字符串为 "out",说明此操作为取消息,接着输入一个非负整数 p\mathit pp,如果 p = 0\mathit p\ =\ \text 0p = 0,则取出当前消息队列中的第一条消息,否则,取出类型为 p\mathit pp 的第一条消息。

如果成功取出消息,则将此消息输出,否则,输出 −1-\text 1−1 表示当前消息队列为空或者没有相应类型的消息。

输入描述:

第一行输入一个正整数 n(3 ≤ n ≤ 2 × 105)\mathit n(\text 3\ \leq\ \mathit n\ \leq\ \text 2\ \times\ \text {10} ^ \text 5)n(3 ≤ n ≤ 2 × 105),表示操作次数。接下去 n\mathit nn 行,每行输入一条操作指令,首先输入一个字符串 opt\mathit {opt}opt,如果 opt = in\mathit {opt}\ =\ \mathit {in}opt = in,则接着输入一个正整数 t(1 ≤ t ≤ 100)\mathit t(\text 1\ \leq\ \mathit t\ \leq\ \text {100})t(1 ≤ t ≤ 100),以及一个非空且仅由小写字母构成的字符串 s(∣s∣ ≤ 10)\mathit s(\mid\mathit s\mid\ \leq\ \text {10})s(∣s∣ ≤ 10);
如果 opt = out\mathit {opt}\ =\ \mathit{out}opt = out,则接着输入一个非负整数 p(0 ≤ p ≤ 100)\mathit p(\text 0\ \leq\ \mathit p\ \leq\ \text {100})p(0 ≤ p ≤ 100);
opt\mathit {opt}opt 只有上述两种可能,具体含义如题所述。题目保证,数据中至少有一条取消息操作。

输出描述:

对于每一条取消息操作,一行输出其消息内容,或者输出 −1-\text 1−1。

示例1

输入

复制15 out 0 out 66 in 66 xyh in 99 ivyhole out 3 out 99 in 3 starry in 6 sky in 66 starrysky out 66 out 0 out 3 out 66 out 0 out 0

15
out 0
out 66
in 66 xyh
in 99 ivyhole
out 3
out 99
in 3 starry
in 6 sky
in 66 starrysky
out 66
out 0
out 3
out 66
out 0
out 0

输出

复制-1 -1 -1 ivyhole xyh starry -1 starrysky sky -1

-1
-1
-1
ivyhole
xyh
starry
-1
starrysky
sky
-1

说明

一开始队列中没有消息,因此,最先的两条取消息操作均输出 −1-\text 1−1。第三、四个操作,依次存入了两条消息,此时,消息队列中的消息排布情况如下:(66, xyh), (99, ivyhole)(\text {66},\ \mathit {xyh}),\ (\text {99},\ \mathit {ivyhole})(66, xyh), (99, ivyhole)第五个操作尝试取类型为 3\text 33 的第一条消息,此时队列中没有此类消息,输出 −1-\text 1−1。第六个操作尝试取类型为 99\text {99}99 的第一条消息,成功取出消息为 "ivyhole"。第七、八、九个操作,依次存入三条消息,此时,消息队列中的消息排布情况如下:(66, xyh), (3, starry), (6, sky), (66, starrysky)(\text {66},\ \mathit {xyh}),\ (\text 3,\ \mathit {starry}),\ (\text 6,\ \mathit {sky}),\ (\text {66},\ \mathit {starrysky})(66, xyh), (3, starry), (6, sky), (66, starrysky)第十个操作,尝试取类型为 66\text {66}66 的第一条消息,成功取出消息 "xyh"。第十一个操作,取队列中的第一条消息,成功取出 "starry"。第十二个操作,尝试取类型为 3\text 33 的第一条消息,此时队列中并没有此类消息,输出 −1-\text 1−1。第十三个操作,尝试取类型为 66\text {66}66 的第一条消息,成功取出 "starrysky"。第十四个操作,取队列中的第一条消息,成功取出 "sky"。第十五个操作,由于队列中没有任何消息,所以输出 −1-\text 1−1。

解题思路:

每个消息保存为一个双向链表的节点Node。然后构建一个双向链表和一个map。

map的key为type类型,value为一个类型为Node的队列。

然后进行节点插入链表enqueue和节点移除链表dequeue的操作。

插入链表时,构造一个新的节点,然后将其插入链表中,并且同时加入到其对应类型的队列中。比如类型为1的节点Node,首先把节点Node插入链表尾部。然后从map中查询类型为1的队列,并把这个节点加入到队列中。

移除链表节点时,主要涉及到从链表中删除以及从type对应的队列中删除。如果type=0,则直接移除链表的头节点,并且根据其type类型,找到对应的队列,然后队列的头部出栈。如果type!=0,则根据type找到队列,把头部出栈并获取到这个节点。因为节点是双向链表结构,所以把这个节点的next节点赋值给其pre.next,当前节点就等于从链表中删除。

代码:

import java.util.Scanner;
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {Node head = null;Node tail = null;Map<Integer, Queue<Node>> map = new HashMap<>();public static void main(String[] args) {// 注意 hasNext 和 hasNextLine 的区别Main main = new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();for (int i = 0; i < n; i++) {String operation = in.next();if ("in".equals(operation)) {int type = in.nextInt();String message = in.next();main.enqueue(type, message);} else if ("out".equals(operation)) {int type = in.nextInt();main.dequeue(type);}}}private void enqueue(int type, String value) {Node node = new Node(type, value);if (head == null) {head = node;} else {tail.next = node;node.pre = tail;}tail = node;Queue<Node> queue = getOrCreate(map, type);queue.add(node);}private void dequeue(int type) {if (head == null) {System.out.println("-1");return;}if (0 == type) {//删除头节点System.out.println(head.value);int outType = head.type;removeHead();Queue<Node> queue = getOrCreate(map, outType);if (queue.size() == 0) {Integer i = null;i.compareTo(1);}queue.poll();return;}Queue<Node> queue = getOrCreate(map, type);Node poll = queue.poll();if (poll != null) {System.out.println(poll.value);//如果是尾节点if (poll == head) {removeHead();} else if (poll == tail) {removeTail();} else {poll.pre.next = poll.next;poll.next.pre = poll.pre;}} else {System.out.println("-1");}}private void removeHead() {Node next = head.next;if (next != null) {next.pre = null;head = next;} else {head = null;tail = null;}}private void removeTail() {Node pre = tail.pre;if (pre != null) {pre.next = null;tail.pre = null;tail = pre;} else {head = null;tail = null;}}private Queue<Node> getOrCreate(Map<Integer, Queue<Node>> map, int type) {Queue<Node> queue = map.get(type);if (queue == null) {queue = new ArrayDeque<>();map.put(type, queue);}return queue;}static class Node {public int type;public String value;public Node pre;public Node next;public Node(int type, String value) {this.type = type;this.value = value;}}
}

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

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

相关文章

LinkedList和ArrayList

LinkedList和ArrayList都是Java中的List接口的实现 内部数据结构&#xff1a; ArrayList是基于动态数组实现的&#xff0c;它支持快速的随机访问&#xff0c;也就是说&#xff0c;获取指定索引位置的元素非常快&#xff0c;时间复杂度为O(1)。 LinkedList是基于双向链表…

input框不可编辑的方法

input框不可编辑的方法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨一个在前端开发中常见的问题——“input框不可编辑的方法”。无论…

在 Nvidia Docker 容器编译构建显存优化加速组件 xFormers

本篇文章&#xff0c;聊聊如何在新版本 PyTorch 和 CUDA 容器环境中完成 xFormers 的编译构建。 让你的模型应用能够跑的更快。 写在前面 xFormers 是 FaceBook Research &#xff08;Meta&#xff09;开源的使用率非常高的 Transformers 加速选型&#xff0c;当我们使用大模…

掌握 gRPC 和 RPC 的关键区别

一、远程过程调用协议简介 1、RPC 的本质 首先&#xff0c;我们探讨一下什么是 RPC。RPC&#xff0c;缩写为 Remote Procedure Call Protocol&#xff0c;直译来看就是远程过程调用协议。 讲得通俗一些&#xff1a; RPC 是一种通信机制RPC 实现了客户端/服务器通信模型 官…

教程-右键用vscode(新窗口)打开文件或目录

通过本文可以提高效率&#xff0c;用起来更爽更高效。 本文实现了&#xff08;windows系统&#xff09;&#xff1a; 右键-用vscode(当前窗口)打开文件或目录右键-用vscode-新窗口打开文件或目录 注意&#xff1a; 下面的安装路径要更改为您实际的路径 具体配置步骤&#x…

TS报错:类型‘object‘上不存在属性‘product_id’

问题&#xff1a; TS报错&#xff1a;类型object上不存在属性product_id。 解决办法&#xff1a; 下面是一个示例代码&#xff0c;演示了如何使用条件语句来安全地从对象中获取属性值&#xff1a; // 使用条件语句进行安全访问 if (dataSource.value.length > 0 &&…

边缘计算:连接实时数据的力量与未来发展之路

边缘计算是一种分布式计算范式&#xff0c;它旨在将数据处理、存储和应用服务带到数据源的近端&#xff0c;即网络的“边缘”。在边缘计算模型中&#xff0c;算力和存储资源距离末端用户或数据源更近&#xff0c;这减少了数据在网络中传输的距离&#xff0c;从而降低延迟&#…

imgaug库指南(19):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

常见的传感器技术汇总简介

传感器技术是现代信息技术的关键组成部分之一&#xff0c;涉及到物理学、化学、生物学等多个学科领域&#xff0c;其应用范围广泛&#xff0c;包括工业自动化、环境监测、医疗保健、智能家居等领域。下面将介绍一些常见的传感器技术&#xff1a; 温度传感器&#xff1a;用于测…

高防ip是什么,防护效果好吗

DDoS攻击是互联网最常见的网络攻击方式之一&#xff0c;通过大量虚假流量对目标服务器进行攻击&#xff0c;堵塞网络耗尽服务器性能&#xff0c;导致服务器崩溃&#xff0c;真正的用户无法访问。以前企业常用的防御手段就是高防服务器&#xff0c;也就是硬防&#xff0c;但由于…

Chrome DevTools 常用面板攻略

文章目录 前言一、概述1.1 简介1.2 DevTools 初步了解 二、设备模式&#xff08;Device Mode&#xff09;2.1 面板概述2.2 设备切换 三、元素面板&#xff08;Elements&#xff09;3.1 面板概述3.2 编辑样式3.2.1 添加、启用和停用 CSS 类3.2.2 添加或移除动态样式3.2.3 快速向…

如何优雅的只在当前页面中覆盖ui库中组件的样式(vue的问题)

首先我们vue文件的样式都是写在<style lang"less" scoped></style>标签中的&#xff0c;加scoped是为了使得样式只在当前页面有效。那么问题来了&#xff0c;看图&#xff1a; 我们正常写的所有样式&#xff0c;都会被加上[data-v-23d425f8]这个属性&…

XYplorer:双栏多标签文件资源管理器的高效选择

在文件管理的世界中&#xff0c;效率和便捷性是用户追求的关键。XYplorer作为一款专为Windows设计的文件资源管理器&#xff0c;以其独特的双栏多标签浏览、强大的文件搜索功能、以及高度可定制的界面&#xff0c;为用户提供了一种全新的文件管理体验。 XYplorer&#xff1a;速…

微信小程序开发学习笔记《11》导航传参

微信小程序开发学习笔记《11》导航传参 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。导航传参 官方文档 一、声明式导航传参 navigator组件的url属性用来指定将要跳转到的页面的路径。同时&#xff0c;路径的后面还可以携带参数…

第七讲 单片机驱动彩色液晶屏 控制RA8889软件:显示文字:Part3.自建字库

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…

redis夯实之路-集群详解

Redis有单机模式和集群模式。 集群是 Redis 提供的分布式数据库方案&#xff0c;集群通过分片( sharding )来实现数据共享&#xff0c;并提供复制和故障转移。集群模式可以有多个 master 。使用集群模式可以进一步提升 Redis 性能&#xff0c;分布式部署实现高可用性&#xff…

Linux中断 -- 中断应答、嵌套、

接上文&#xff0c;本文继续介绍Linux软件部分逻辑。 参考内核版本&#xff1a;kernel-4.19 目录 1.中断信号在各级中断控制器中的应答 2.supports_deactivate_key意义 3.中断嵌套 1.中断信号在各级中断控制器中的应答 本章主要从内核软件层面来看各中断控制器对中断信号处…

Linux mdir命令教程:使用mdir命令查看MS-DOS目录内容(附实例详解和注意事项)

Linux mdir命令介绍 mdir命令用于显示MS-DOS目录的内容&#xff0c;或者一些MS-DOS文件的条目。你可以使用它来模拟MS-DOS的dir命令以显示目录内容&#xff0c;这是mtools命令集的一部分。同样&#xff0c;这是一个非常实用的命令&#xff0c;能帮助我们在Linux系统环境下更好…

Android开发基础(三)

Android开发基础&#xff08;三&#xff09; 本篇将介绍Android权限管理。 Android权限管理 Android权限管理主要是为了保护用户的隐私和设备的安全性&#xff1b; 在Android系统中&#xff0c;应用在请求权限时必须进行明确的申请&#xff0c;根据权限的保护级别&#xff0…