首页 > 编程语言 >华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C

华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C

时间:2024-11-03 13:17:28浏览次数:3  
标签:顺序 Java Python 双端 queue int result operation order

最新华为OD机试

题目描述

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

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

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

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

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

输入描述

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

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

  • head add x表示从头部添加数据 x,
  • tail add x 表示从尾部添加数据x,

另外 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;
}

标签:顺序,Java,Python,双端,queue,int,result,operation,order
From: https://blog.csdn.net/long_xiao_yu/article/details/143463556

相关文章

  • 华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C
    最新华为OD机试题目描述记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃......
  • 基于 JAVASSM 框架沙县小吃点餐系统
    基于JAVASSM框架(即Java+Spring+SpringMVC+MyBatis)开发一个沙县小吃点餐系统。步骤一:需求分析明确系统需要实现的功能,比如:用户注册和登录浏览菜单添加菜品到购物车下单并支付订单管理后台管理(菜品管理、订单管理等)步骤二:设计数据库使用MySQL数据库存储系统......
  • 【java开发】FileWriter
    原创大常运维FileWriter(文件字符输出流):作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。构造函数和方法:代码:packagecn.chang.d1_char_stream;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;......
  • 一文彻底熟练掌握并使用Java的NIO操作
    一、基本概念JavaNIO是Java1.4引入的,用于处理高速、高并发的I/O操作。与传统的阻塞I/O不同,NIO支持非阻塞I/O和选择器,可以更高效地管理多个通道。二、核心组件通道(Channel)Channel是NIO中用于读取和写入数据的主要接口,提供双向数据传输的能力。常见的通道......
  • 工程师和科学家的高等数学及python实例:1三角函数
    1三角函数在学习了本章内容之后,你应该能够说明三角函数比计算任意给定角的正弦、余弦和正切讨论象限及其应用确定特殊角(0°,30°,45°,60°,90°)的三角比使用特殊角的精确正弦值、余弦值和正切值绘制正弦函数、余弦函数和正切函数的图形1.1引言三角学是数学的......
  • Python图像处理库PIL,实现旋转缩放、剪切拼接以及滤波
    文章目录切割缩放和旋转拼接PIL的Image类,提供了一些常用的图像处理方法。切割缩放和旋转PIL可以很方便地实现如下效果代码如下fromPILimportImagepath='lena.jpg'img=Image.open(path)#读取img.resize((50,50),resample=Image.Resampling.NEARES......