华为OD机试之最小调整顺序次数、特异性双端队列(Java源码)

这篇具有很好参考价值的文章主要介绍了华为OD机试之最小调整顺序次数、特异性双端队列(Java源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最小调整顺序次数、特异性双端队列

题目描述

有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。
小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 要调整的最小次数。

源码和解析
解析:

其实这个题只要理解了就其实还蛮简单的。小编当时做这个提题目时候前面一脸懵B,压根不知道在说个啥。就只知道要调整次数,但是不确定这个调整次数是啥。
head add 1
[1]
tail add 2
[1, 2]
remove
[2]
head add 3
[3, 2]
tail add 4
[3, 2, 4]
head add 5
[5, 3, 2, 4]
remove
排序了
[3, 4, 5]
remove
[4, 5]
remove
[5]
remove
[]
这个是用例中的例子 输出过程。 认真去体会每个指令执行后的结果
若输入变成
5
head add 2
tail add 1
remove
head add 3
tail add 4
head add 5
remove
remove
remove
remove
排序了1次
那么其输出过程为:
head add 2
[2]
tail add 1
[2, 1]
remove
排序了
[2]
head add 3
[3, 2]
tail add 4
[3, 2, 4]
head add 5
[5, 3, 2, 4]
remove
排序了
[3, 4, 5]
remove
[4, 5]
remove
[5]
remove
[]
排序了2次
====》可以推出 ,当集合中首位值不是集合中最小值是,需要进行调整。而一次调整包含了多次交换位置过程。可以简单的理解为1次排序过程。

示例代码:文章来源地址https://www.toymoban.com/news/detail-472139.html

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class T33 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String input = scanner.nextLine();
		int num = Integer.parseInt(input); // 数据范围 并非是数的个数
		List<Integer> numList = new ArrayList<Integer>();
		int count = 0;// 调整次数
		int removeNum = 1;// 下一次需要移走哪一个
		for (int i = 0; i < num * 2; i++) {
			input = scanner.nextLine();
			String strArr[] = input.split(" ");
			System.out.println(input);
			if (strArr[0].equals("remove")) {
				// remove 从头部移出数据
				if (numList.get(0) == removeNum) {
					numList.remove(0);
					removeNum++;
				} else {
					count++;
					// 调整次序 从小到大排序一下
					numList.sort(new Comparator<Integer>() {
						@Override
						public int compare(Integer o1, Integer o2) {
							if (o1 > o2)
								return 1;
							if (o1 < o2)
								return -1;
							return 0;
						}
					});
					System.out.println("排序了");
					numList.remove(0);
					removeNum++;
				}
			}
			// 头部添加
			if (strArr[0].equals("head")) {
				numList.add(0, Integer.parseInt(strArr[2]));
				// continue;
			} else if (strArr[0].equals("tail")) {
				// 尾部添加
				numList.add(Integer.parseInt(strArr[2]));
			}
			System.out.println(numList);
		}
		System.out.println(count);
	}
}

到了这里,关于华为OD机试之最小调整顺序次数、特异性双端队列(Java源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试 - 学生重新排队、小朋友分组最少调整次数(Java & JS & Python & C & C++)

    题目描述 n 个学生排成一排,学生编号分别是 1 到 n,n 为 3 的整倍数。 老师随机抽签决定将所有学生分成 m 个 3 人的小组(n == 3 * m) , 为了便于同组学生交流,老师决定将小组成员安排到一起,也就是同组成员彼此相连,同组任意两个成员之间无其它组的成员。 因此老师

    2024年02月20日
    浏览(45)
  • 【华为OD机考 统一考试机试C卷】小朋友分组最少调整次数(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年04月13日
    浏览(63)
  • 华为OD机试之用户调度问题(Java源码)

    题目描述 在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和性能。 假设当前有n个待串行调度用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度,并返回总的消耗资源

    2024年02月08日
    浏览(44)
  • 华为OD机试之最长连续子序列(Java源码)

    题目描述 有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度, 如果没有满足要求的序列,返回-1。 输入描述 第一行输入是:N个正整数组成的一个序列 第二行输入是:给定整数sum 输出描述 最长的连续子序列的长

    2024年02月09日
    浏览(41)
  • 华为OD机试之矩阵最大值(Java源码)

    题目描述 给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1.每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2.允许通过向左或向右整体循环移动每行元素来改变各元素

    2024年02月11日
    浏览(54)
  • 华为OD机试之阿里巴巴找黄金宝箱(I)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和; 第一个箱子左边部

    2024年02月09日
    浏览(47)
  • 华为OD机试之全量和已占用字符集(Java源码)

    题目描述 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。 输入描述 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集 已占用字符集中的字符一定是全量字符集中的字符 字符集中的字符跟字符之间使用英文

    2024年02月07日
    浏览(51)
  • 华为OD机试之Boss分销提成计算(boss的收入)(Java源码)

    题目描述 一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销. 规定,每个月,下级分销需要将自己的总收入 (自己的+下级上交的) 每满100元上交15元给自己的上级. 现给出一组分销的关系,和每个分销的收入,

    2024年02月09日
    浏览(51)
  • 华为OD机试之阿里巴巴找黄金宝箱(II)(Java源码)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~n 的箱子,每个箱子上面贴有箱子中藏有金币的数量。 从金币数量中选出一个数字集合,并销毁贴有这些数字的每个箱子,如果能销毁一半及以上的箱子,则返回这个数字

    2024年02月09日
    浏览(54)
  • 华为OD机试 - 座位调整(Java & JS & Python)

    题目描述 疫情期间课堂的座位进行了特殊的调整,不能出现两个同学紧挨着,必须隔至少一个空位。 给你一个整数数组 desk 表示当前座位的占座情况,由若干 0 和 1 组成,其中 0 表示没有占位,1 表示占位。 在不改变原有座位秩序情况下,还能安排坐几个人? 输入描述 第

    2024年02月11日
    浏览(108)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包