第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移

article/2025/9/17 22:05:58

【问题描述】
小蓝有一个长度为 N 的数组,初始时从左到右依次是 1, 2, 3, . . . N。
之后小蓝对这个数组进行了 M 次操作,每次操作可能是以下 2 种之一:

  1. 左移 x,即把 x 移动到最左边。
  2. 右移 x,即把 x 移动到最右边。

请你回答经过 M 次操作之后,数组从左到右每个数是多少?

【输入格式】
第一行包含 2 个整数,N 和 M。
以下 M 行每行一个操作,其中 “L x”表示左移 x,“R x”表示右移 x。

【输出格式】
输出 N 个数,代表操作后的数组。

【样例输入】
5 3
L 3
L 2
R 1
【样例输出】
2 3 4 5 1
【样例说明】
样例中的数组变化如下:
试题 C: 左移右移 4
第十三届蓝桥杯大赛软件赛决赛 Java 大学 B 组
[1, 2, 3, 4, 5] → [3, 1, 2, 4, 5] → [2, 3, 1, 4, 5] → [2, 3, 4, 5, 1]
【评测用例规模与约定】
对于 50% 的评测用例,1 ≤ N, M ≤ 10000.
对于 100% 的评测用例,1 ≤ N, M ≤ 200000, 1 ≤ x ≤ N.

解题思路

我们可以把每一个数字放入一个map集合中,自己作为key,把value当成权重值,默认为这个数字本身。每一个左移右移修改对应的权重值,最后根据权重值来排序。

可以设置一个最左边界的临界值 L=0,每进行一次左移操作,把这个元素相对的权重值改为最左临界值,再把临界值进行自减操作。

同理,设置一个最右边界的临界值R=n+1,每进行一次右移操作,把这个元素相对的权重值改为最右临界值,再把临界值进行自增操作。

在这里插入图片描述

Java代码(AC)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;public class Main {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException {String[] num = br.readLine().split(" ");int n=Integer.parseInt(num[0]);int m=Integer.parseInt(num[1]);int l=0,r=n+1;HashMap<Integer,Integer> map=new HashMap<>();for (int i=1;i<=n;i++){map.put(i,i);}while (m>0){String[] s = br.readLine().split(" ");if (s[0].equals("L")){map.put(Integer.parseInt(s[1]),l--);//每次左移之后。临界值就要自减。因为后续是根据value值来排序的}else {map.put(Integer.parseInt(s[1]),r++);//每次右移之后。临界值就要自增}m--;}List<Map.Entry<Integer,Integer>> list=new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());//把map集合根据value排序Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o1.getValue()-o2.getValue();}});for (Map.Entry<Integer, Integer> mapping : list) {System.out.print(mapping.getKey()+" ");}}
}

http://chatgpt.dhexx.cn/article/0WyExB53.shtml

相关文章

算术逻辑左移右移

左移&#xff08;<<&#xff09;&#xff1a; 算术左移和逻辑左移的规则相同&#xff0c;都是整体左移&#xff0c;高位舍去&#xff0c;低位补零。 而且我们知道在计算机内部中的数都是用补码来进行存储的&#xff0c;这样便可以把减法运算也转化为加法运算。 1110的原码…

位运算符之左移右移(简单易懂)

前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/details/98736834 | 按位或 [链接]:https://blog.csdn.net/weixin_42837024/article/details/98745019 ^ 按位异或 [链接]:https://blog…

关于左移右移的一些问题,左移右移之后应该应该赋值给原变量

关于左移右移的一些问题&#xff0c;左移右移之后应该应该赋值给原变量 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。…

蓝桥杯第十三届决赛真题-左移右移

左移右移 一、思路分析二、数组模拟双链表❗️❗️三、代码展示 题目链接 问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3, …N 。 之后小蓝对这个数组进行了 M 次操作, 每次操作可能是以下 2 种之一: 左移 x, 即把 x 移动到最左边。 右移 x, 即把 x 移动到…

C语言左移右移操作符详解

看到过很多C语言中的移位操作相关的博文&#xff0c;但是这些博文之间的深度实在是差别太大了&#xff0c;对于初学者来说&#xff0c;想要弄明白移位操作并不容易&#xff0c;有的博文仅仅是讲了怎么进行位移&#xff0c;初学者可能会因此写下bug&#xff0c;有的博文虽然到位…

彻底理解位运算——左移、右移

相信大家在各种语言各种框架中都能看到二进制的操作。左移、右移、&、|、^等等操作。那么这篇帖子让各位彻底弄懂左移、右移。 首先先区分那个是左移、那个是右移&#xff0c;这很简单&#xff0c;从箭头指向的方向来区分。<<左移&#xff0c;>>右移 左移&am…

汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 伪算法&#xff1a; 如果是1个盘子 直接将A柱子上的盘子从A移到C 否则 先将A柱子上的n-1个盘子借助C移到B <?php function hannuota($n,$a,$b,$c){if ($n1) {echo 盘子 .$n. 直接从柱子 .$a. 移动到柱子 .$c.<br/…

汉诺塔Java递归实现

2019独角兽企业重金招聘Python工程师标准>>> 算法逻辑&#xff1a; 利用递归&#xff0c;当n为1时为递归出口&#xff0c;通过改变柱子的位置实现 当只有一个盘子时是从a&#xff08;初始&#xff09;->c&#xff08;目的&#xff09; 当有n个盘子时 先 &#x…

汉诺塔------java算法

这其实是一个递归问题&#xff0c;下面是用Java对汉诺塔的实现。 源代码&#xff1a; 方式一&#xff1a; import java.util.Scanner;/***BelongsProject: javaSenior*BelongsPackage: PACKAGE_NAME*Author: 48-zj*CreateTime: 2023-04-13 22:09*Description: TODO*Version:…

数据结构与算法之递归

直接或间接地调用自身的算法称为递归算法。 通过这种递推关系把原来问题缩小成一个更小规模的同类问题&#xff0c;并延续这一缩小规模的过程&#xff0c;直到在某一规模上&#xff0c;问题的解是已知的。这样一种解决问题的思想我们称为递归的思想。 常见题目1&#xff1a; …

递归详解-斐波那契、汉诺塔、青蛙跳台阶、字符串长度

递归-斐波那契数列 这里我们讲解一下 斐波那契数列的经典递归问题。 斐波那契数列&#xff1a; 1 1 2 3 5 8 13 21 34… 从第三个数字开始&#xff0c;下一个数字等于前面两个数字之后&#xff0c;有点像我们数学的数列 n(x-1)n(x-2) 那如果我们要求第n个数字&#xff0c;应该…

HDU - 1995 汉诺塔V 难度:递归入门 复杂度:有点复杂

方案一&#xff08;公式法&#xff09; 我还不清楚用递归来解汉诺塔问题是怎么解&#xff0c;对递归比较陌生&#xff0c;但后来发现这题可以不用递归&#xff0c;套用下面发现的公式即可。 一个盘 1号1次 两个盘 1号2次 2号1次 三个盘 1号4次 2号2次 3号1次 四个盘…

【Python学习】Python解决汉诺塔问题

摘要&#xff1a; 参考文章&#xff1a;http://www.cnblogs.com/dmego/p/5965835.html 一句话&#xff1a;学程序不是目的&#xff0c;理解就好&#xff1b;写代码也不是必然&#xff0c;省事最好&#xff1b;拿也好&#xff0c;查也好&#xff0c;解决问题就好&#xff01; 信…

C++ 汉诺塔程序实现

2019独角兽企业重金招聘Python工程师标准>>> 首先不看代码&#xff0c;汉诺塔解题步骤有三步&#xff08;设A->C&#xff09;&#xff0c;先将汉诺塔看成两部分n-1,1(n-1在上面) 第一&#xff1a;将A中的n-1个盘借助C移到B >Hanoi(n-1,a,c,b); 第二&#xff…

【算法与数据结构】汉诺塔

数据结构里的汉诺塔&#xff0c;递归的典型代表&#xff0c;几乎讲到递归都会讲到汉诺塔&#xff0c;今天才把汉诺塔看明白&#xff0c;惭愧啊。 不废话了&#xff0c;贴代码&#xff0c;基本思想在注释里有&#xff0c;话说往CNBLOG首页投了两次&#xff0c;两次都被小编给扯下…

递归-汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 递归&#xff08;recursion&#xff09;&#xff1a;程序调用自身的编程技巧。 反复执行的过程&#xff08;调用自身&#xff09;有跳出反复执行过程的条件&#xff08;递归出口&#xff09; import com.lifeibigdata.al…

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明&#xff1a; ‍算法&#xff1a;当只有一个盘子的时候&#xff0c;只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是&#xff0c;先将A塔上的1号盘子&#xff08;编号从上到下&#xff09;移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手&#xff0c;看到的不喜勿喷&#xff0c;还望大神指教。 随着Node.js&#xff0c;Angular.js,JQuery的流行&#xff0c;点燃了我学习JavaScript的热情&#xff01;以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现&#xff0c;加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题&#xff0c;有些题提供了多种解法&#xff0c;希望可以帮助你打开思路&#xff0c;如果你有更多的解法&#xff0c;欢迎评论区留言哟~ 目录 一、输入1234&#xff0c;输出1 2 3 4 二、模拟strlen功能 1&#xff09;递归 2&…

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…