蓝桥杯-左移右移(2022国赛)

这篇具有很好参考价值的文章主要介绍了蓝桥杯-左移右移(2022国赛)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、问题描述

  小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3,…N

  之后小蓝对这个数组进行了 M 次操作, 每次操作可能是以下 2 种之一:

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

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

输入格式

  第一行包含 2 个整数, NM

  以下 M 行每行一个操作, 其中 “L x "表示左移x,"Rx "表示右移x

输出格式

  输出 N 个数, 代表操作后的数组。

样例输入

5 3
L 3
L 2
R 1

样例输出

2 3 4 5 1

样例说明

  样例中的数组变化如下:

[ 1 , 2 , 3 , 4 , 5 ] → [ 3 , 1 , 2 , 4 , 5 ] → [ 2 , 3 , 1 , 4 , 5 ] → [ 2 , 3 , 4 , 5 , 1 ] [1,2,3,4,5]→[3,1,2,4,5]→[2,3,1,4,5]→[2,3,4,5,1] [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≤xN.

运行限制

  • 最大运行时间:3s
  • 最大运行内存: 512M

2、解题思路与代码实现

2.1 方法一:使用LinkedList双向链表实现(50%)

  我们使用双向链表结构来存储这N个元素,若输入的是L x,我们就找到这个x,将该节点移动到链表的头部,可以直接将该节点删除,然后使用addFirst(E e)方法直接插入到链表头部。

  若输入的是R x,我们也找到这个x,然后使用addLast(E e)将该节点移动到链表的尾部即可。

  双向链表插入和删除元素比较快,但是我们的时间主要花费在了查找x这个值上面,这个方法只能通过50%的测试用例

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i <n; i++) {
            list.addLast(i+1);
        }
        for (int i = 0; i <m ; i++) {
            String s = scan.next();
            int num = scan.nextInt();
            if(s.equals("L")){//左移
                //删除此列表中指定元素的第一个出现(从头到尾遍历列表时
                //由于此集合中没有重复元素,所以结果正确
                list.removeFirstOccurrence(num);
                list.addFirst(num);
            }else{//右移
                list.removeFirstOccurrence(num);
                list.addLast(num);
            }
        }
        list.forEach(x->{
            System.out.print(x+" ");
        });
        scan.close();
    }
}

蓝桥杯-左移右移(2022国赛)

2.2 方法二:使用HashMap+左右临界值实现(100%)

  我们使用HashMap存储这n个值,初始化的时候keyvalue相等,都存的是数值。

  定义两个边界,左边界:l=0,有边界:r=n+1

  然后从第一个元素开始遍历,当接收到L x,开始左移的时候,我们的key不动,将value赋值为左边界l,并将左边界自减l--

  当接收到R x,开始右移动的时候,我们同样将key不动,将value赋值为右边界R,同时将右边界的值自增r++

  遍历结束之后,我们只需要将map中的值按照value排序,然后输出排序之后的key即可。

  移动的过程如下图所示

蓝桥杯-左移右移(2022国赛)

import java.util.*;
import java.util.stream.Collectors;

public class ACCode {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        int l=0;//最左临界值
        int r=n+1;//最优临界
        HashMap<Integer, Integer> map = new HashMap<>();
        //key和value的初始化
        for (int i = 1; i <=n ; i++) {
            map.put(i,i);
        }
        for (int i = 0; i <m ; i++) {
            String s = scan.next();
            int num = scan.nextInt();
            if(s.equals("L")){
                //如果是左移,将value赋值为左临界值,再将左临界值自减
                map.put(num,l--);
            }else{
                //如果是右移,则将value赋值为右临界值,并将右边临界值+1
                map.put(num,r++);
            }
        }
		//查看此时的map
        System.out.println(map);
        //将map根据value排序并输出
        map.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue())
                .map(Map.Entry::getKey)
                .collect(Collectors.toList())
                .forEach(x->System.out.print(x+" "));

    }
}

  输入测试用例,顺便打印下移动结束之后的map

蓝桥杯-左移右移(2022国赛)

方法二思路来源:https://blog.csdn.net/weixin_64061088/article/details/128696642文章来源地址https://www.toymoban.com/news/detail-402626.html

到了这里,关于蓝桥杯-左移右移(2022国赛)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 2022蓝桥杯冲刺(历年真题剖析,含省赛、国赛)

    大家好,我是莫若心,为了帮助兄弟们更好准备蓝桥杯比赛,我特意选取了蓝桥往年真题中许多能体现出蓝桥经典题型的题目,有需要的兄弟们可以收藏一下,后续我会继续更新蓝桥真题题型专栏,和大家一起冲击蓝桥杯 附上蓝桥杯官网地址:蓝桥杯官网 🚩🚩 题目如下 观

    2023年04月08日
    浏览(28)
  • 有符号数和无符号数左移和右移

    主要是有符号数的左移。 有的说不管符号位,直接左移,所以可以一会正数一会复数 https://bbs.csdn.net/topics/391075092 有的说符号位不动,其他来左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://wenku.baidu.com/view/6e31935402f69e3143323968011ca300a6c3f60d.html? wkts =1

    2024年02月01日
    浏览(27)
  • C#的几种位操作运算,与、或、非、异或、左移、右移

    C#的常见几种位操作运算,与($)、或(|)、非(~)、异或(^)、左移()、右移() 位操作一般来说比加减乘除计算要快一些 与()操作符的位都为1时,才为1,其他都为0,因此与()操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数 或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作

    2024年02月16日
    浏览(27)
  • C语言:位运算符----与(&),或(|),非(~),异或(^),左移(<<)和右移(>>)

    C语言 基础开发----目录 位运算符 就是按二进制位进行运算。 C语言中位运算符主要包括六种,具体如下: 与(),或(|),非(~),异或(^),左移()和右移() 位运算符 含义 说明 按位 与 有0为0,双1为1: 11=1,10=0,01=0,00=0 只有两者对应位都为 1 ,结果对应位才为 1 ,否则为 0 I 按

    2024年01月18日
    浏览(37)
  • 2022蓝桥杯C++B组国赛真题题解

    目录 A:2022 B:钟表 C:卡牌 D:最大数字 E:出差 F:费用报销 G:故障 H:机房 I:齿轮 J:搬砖 问题描述 将 2022 拆分成 10 个互不相同的正整数之和, 总共有多少种拆分方法? 注意交换顺序视为同一种方法, 例如 2022=1000+1022 和 1022+1000 就视为同一种方法。 答案提交 这是一道结果填空的

    2024年02月06日
    浏览(27)
  • 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一、基础知识补充     (1)位运算     (2)二进制的详细操作 二、位运算     (1)按位与()     (2)按位或(|)     (3)按位异或(^)       (4)按位左移()     (5)按位右移() 三、位运算例题     题目描述:     题解: 四、共勉     位运算符要比一般

    2024年02月03日
    浏览(31)
  • 题解动态规划:蓝桥杯2022国赛B组 题解 A题目

    在这组题(蓝桥杯C/C++ B组 国赛)里面挑了几道喜欢的题目,做了一下,笔记思路如下。( 其实是我觉得能做出的题 ) 题目图片来源于:CSDN 罚时大师月色 请问2022,拆分成10个不同的正整数有多少种不同的分法。 这道题目,拿到手上的时候,第一个想法是暴力,但是,每次

    2023年04月08日
    浏览(76)
  • 软件测试流程扫盲:V/W/H模型,测试左移测试右移

    想了想,如何运用在工作环境进阶一个小level:公司当前的软件测试模型更类似于H模型,然后测试流程也倾向于传统测试流程,单元集成冒烟系统回归验收测试,单元一般是开发自己去写去做。【左移右移做的还不好,需要后面学习相关技术运用在工作中】 V模型是瀑布模型

    2024年02月12日
    浏览(22)
  • 2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解

    2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解 补题链接:地址 两个填空题说实话感觉非常花时间。 第1题 —— 2022 (5分) 题意:将2022拆成10个数相加,有多少方案。 思路:划分dp经典题,数字i划分成j个数。 答案:379187662194355221 第2题 —— 钟表 (5分) 题意

    2024年02月04日
    浏览(29)
  • learn_C_deep_11 (深刻理解整形提升、左移和右移规则、花括号、++和--操作、表达式匹配:贪心算法)

    深刻理解整形提升 左移和右移规则 如何理解\\\"丢弃\\\" 一个问题  0x012+3 的值是多少 花括号 ++、--操作 表达式匹配:贪心算法 char类型的c经过按位取反、左移和右移是不是char类型了?为什么char类型的c加了操作符运算求空间大小就不是1了呢?         无论任何位运算符,目

    2024年02月05日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包