news 2026/4/3 3:44:21

(新卷,100分) - 最小的调整次数特异性双端队列(Java Python JS C++ C )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分) - 最小的调整次数特异性双端队列(Java Python JS C++ C )

题目描述

有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。

小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。

现在要求移除数据的顺序为1到n。

为了满足最后输出的要求,小A可以在任何时候调整队列中数据的顺序。

请问 小A 最少需要调整几次才能够满足移除数据的顺序正好是1到n。

输入描述

第一行一个数据n,表示数据的范围。

接下来的2n行,其中有n行为添加数据,指令为:

另外 n 行为移出数据指令,指令为:remove的形式,表示移出1个数据;

1 ≤ n ≤ 3 * 10^5。

所有的数据均合法。

输出描述

一个整数,表示 小A 要调整的最小次数。

示例1

输入

5 head add 1 tail add 2 remove head add 3 tail add 4 head add 5 remove remove remove remove

输出

1

说明

解题思路

Java

import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int number = scanner.nextInt();//数据的范围 scanner.nextLine(); Queue<Integer> queue = new LinkedList<>();//模拟双端队列 boolean in_order = true;//是否按顺序删除 int result = 0;//最小的调整顺序次数 for (int i = 0; i < 2 * number; i++) { String input_str = scanner.nextLine(); String[] operation = input_str.split(" "); if (operation[0].equals("head")) {//从头部添加元素 if (!queue.isEmpty() && in_order) {//不按顺序删除 in_order = false; } queue.add(Integer.parseInt(operation[2])); } else if (operation[0].equals("tail")) {//从尾部添加元素 queue.add(Integer.parseInt(operation[2])); } else {//删除元素 if (queue.isEmpty()) { continue; } if (!in_order) {//不按顺序删除 result++; in_order = true; } queue.poll(); } } System.out.println(result);//输出最小的调整顺序次数 } }

Python

from collections import deque number = int(input()) # 数据的范围 queue = deque() # 模拟双端队列 in_order = True # 是否按顺序删除 result = 0 # 最小的调整顺序次数 for i in range(2 * number): input_str = input() operation = input_str.split(" ") if operation[0] == "head": # 从头部添加元素 if len(queue) != 0 and in_order: # 不按顺序删除 in_order = False queue.appendleft(int(operation[2])) elif operation[0] == "tail": # 从尾部添加元素 queue.append(int(operation[2])) else: # 删除元素 if len(queue) == 0: continue if not in_order: # 不按顺序删除 result += 1 in_order = True queue.pop() print(result) # 输出最小的调整顺序次数

JavaScript

const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let number = 0; let operations = []; rl.on('line', (input) => { if (number === 0) { number = parseInt(input); } else { operations.push(input.split(" ")); if (operations.length === 2 * number) { rl.close(); } } }); const queue = []; // 模拟双端队列 let in_order = true; // 是否按顺序删除 let result = 0; // 最小的调整顺序次数 rl.on('close', () => { for (let i = 0; i < 2 * number; i++) { const operation = operations[i]; if (operation[0] === "head") { // 从头部添加元素 if (queue.length !== 0 && in_order) { // 不按顺序删除 in_order = false; } queue.unshift(parseInt(operation[2])); } else if (operation[0] === "tail") { // 从尾部添加元素 queue.push(parseInt(operation[2])); } else { // 删除元素 if (queue.length === 0) { continue; } if (!in_order) { // 不按顺序删除 result += 1; in_order = true; } queue.pop(); } } console.log(result); // 输出最小的调整顺序次数 });

C++

#include <iostream> #include <queue> using namespace std; int main() { int number; cin >> number; cin.ignore(); queue<int> queue; bool in_order = true; int result = 0; for (int i = 0; i < 2 * number; i++) { string input_str; getline(cin, input_str); string operation[3]; int j = 0; for (char c : input_str) { if (c == ' ') { j++; } else { operation[j] += c; } } if (operation[0] == "head") { if (!queue.empty() && in_order) { in_order = false; } queue.push(stoi(operation[2])); } else if (operation[0] == "tail") { queue.push(stoi(operation[2])); } else { if (queue.empty()) { continue; } if (!in_order) { result++; in_order = true; } queue.pop(); } } cout << result << endl; return 0; }

C语言

#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 600000 // 定义队列的最大容量(2n) int queue[MAX_SIZE]; // 模拟双端队列的数组 int front = 0; // 队列头部索引 int rear = -1; // 队列尾部索引 int size = 0; // 当前队列中的元素数量 int main() { int n; scanf("%d", &n); // 读取数据范围n int result = 0; // 记录最小的调整顺序次数 int expected = 1; // 期望移除的下一个元素 int in_order = 1; // 标记是否按顺序删除 for (int i = 0; i < 2 * n; i++) { char operation[10]; int x; scanf("%s", operation); // 读取操作类型 if (operation[0] == 'r') { // 如果是 "remove" 操作 if (queue[front] != expected) { // 如果移除的元素不是期望的 in_order = 0; // 标记为不按顺序 } else { expected++; // 移除的元素符合预期,更新下一个期望值 } front = (front + 1) % MAX_SIZE; // 更新头部索引 size--; // 减少队列中的元素数量 } else { // 如果是 "head add" 或 "tail add" 操作 scanf("%*s %d", &x); // 读取要添加的元素x if (operation[0] == 'h') { // 如果是 "head add" front = (front - 1 + MAX_SIZE) % MAX_SIZE; // 更新头部索引 queue[front] = x; // 从头部添加元素 } else { // 如果是 "tail add" rear = (rear + 1) % MAX_SIZE; // 更新尾部索引 queue[rear] = x; // 从尾部添加元素 } size++; // 增加队列中的元素数量 } if (!in_order && size == 0) { // 如果当前不按顺序且队列为空 result++; // 增加调整次数 in_order = 1; // 重置为按顺序状态 } } printf("%d\n", result); // 输出最小的调整顺序次数 return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 14:19:34

Linux 新用户创建及初始化工作

Linux 新用户创建及初始化工作 创建用户并添加管理员权限 # 添加并设置用户username为管理员 sudo adduser username sudo usermod -aG sudo username # 查看组 getent group # 查看有sudo权限的用户 getent group sudo挂载nas sudo mount -t cifs //<nas服务器ip地址>/&…

作者头像 李华
网站建设 2026/3/27 14:06:47

深入探讨AI原生应用领域RAG的行业应用

深入探讨AI原生应用领域RAG的行业应用 关键词&#xff1a;RAG&#xff08;检索增强生成&#xff09;、大语言模型、行业应用、知识增强、AI原生应用 摘要&#xff1a;本文从RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;的核心原理出发&…

作者头像 李华
网站建设 2026/4/2 7:08:42

PandaWiki:AI驱动的开源知识库系统,一键部署实现智能问答与文档管理

PandaWiki是AI大模型驱动的开源知识库系统&#xff0c;可快速构建产品文档、FAQ和博客等。它整合AI辅助写作、问答和搜索功能&#xff0c;支持多渠道内容导入和第三方集成。安装部署简单&#xff0c;只需在Linux服务器执行命令即可。项目已获6000 stars&#xff0c;持续更新&am…

作者头像 李华
网站建设 2026/3/31 9:15:36

一篇文章搞懂GIS与AI智能体,非常详细收藏我这一篇就够了

在 GIS 业务圈里&#xff0c;我们常自嘲是“做地图的”或者“切数据的”。每当业务部门提出一个需求&#xff1a;“帮我找一下最近三个月&#xff0c;五环以内&#xff0c;且周边 500 米有学校的餐饮违规店铺。”作为 PM 或技术人员&#xff0c;我们脑子里瞬间闪过的是&#xf…

作者头像 李华
网站建设 2026/4/1 10:28:16

人工智能论文降重工具评测:8个平台的改写效果对比

实测对比8款热门AI论文工具在降重、降低AIGC检测率及论文写作等核心功能的表现&#xff0c;综合评估效率、准确性和用户体验后&#xff0c;根据客观数据与真实反馈得出排名&#xff0c;便于用户高效匹配实际需求。 排名 工具名称 关键优势 1 aibiye 高度适配主流检测平台&…

作者头像 李华