第十三届蓝桥杯Java B 组国赛 C 题——左移右移(AC)
创始人
2024-05-26 16:11:37

目录

  • 1.左移右移
    • 1.题目描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例输入
    • 5.样例输出
    • 6.数据范围
    • 6.原题链接
  • 2.解题思路
  • 3.Ac_code

1.左移右移

1.题目描述

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

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

  1. 左移 xxx, 即把 xxx 移动到最左边。

  2. 右移 xxx, 即把 xxx 移动到最右边。

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

2.输入格式

第一行包含 2 个整数, NNN 和 MMM 。以下 MMM 行每行一个操作, 其中 “LxLxLx "表示左移 xxx ,"RxRxRx "表示右移 xxx 。

3.输出格式

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

4.样例输入

5 3
L 3
L 2
R 1

5.样例输出

2 3 4 5 1

6.数据范围

1≤N,M≤200000,1≤x≤N.1≤N,M≤200000,1≤x≤N.1≤N,M≤200000,1≤x≤N.

6.原题链接

左移右移

2.解题思路

  题目的含义非常简单,如果按照朴素的方式遍历寻找 xxx,然后直接进行插入操作,在nnn的级别在2e52e52e5的范围这时间复杂度显然是不可接受的。想要解决此题我们需要思考两个点:

  1. 如何高效地进行插入和删除操作
  2. 如何快速地找到某个点所在的位置

  对于第一点,我们应该快速地想到链表这个数据结构,由于题目需要在左端点和右端点都进行插入操作,所以我们应该联想到 双链表 。它可以在O(1)O(1)O(1)的时间范围内对元素进行插入和删除,这显然是我们需要的数据结构。
  当然,双链表并不支持高效地查找,所以我们如何快速找到 xxx 的位置呢?这时候我们应该联想到 哈希表,因为我们需要手动实现双链表,所以每个链表结点都对应一个值,同时它也是一个对象,我们可以使用哈希表,以值为keykeykey,以这个链表结点对象为valuevaluevalue。这样我们就可以快速获得这个结点,然后再进行常规的双链表插入删除操作。

3.Ac_code

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.*;public class Main {static Map map=new HashMap<>();static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();//双链表的头结点和尾结点Node head=new Node(-1,null,null);Node last=new Node(-1,null,null);Node pre=head;//构建双链表for (int i = 1; i <=n; i++) {pre.next=new Node(i,pre,null);pre=pre.next;map.put(i,pre);}last.pre=pre;pre.next=last;for (int i = 0; i < m; i++) {char c=sc.next().charAt(0);int x=sc.nextInt();//先将x对应的结点在双链表中删除Node node=map.get(x);node.pre.next=node.next;node.next.pre=node.pre;if (c=='L'){//将其插入到左端点node.next=head.next;head.next.pre=node;head.next=node;node.pre=head;}else{//将其插入到右端点node.pre=last.pre;last.pre.next=node;node.next=last;last.pre=node;}}pre=head.next;while (pre!=last){out.print(pre.v+" ");pre=pre.next;}out.flush();}static class Node{int v;Node pre;Node next;public Node(int v, Node pre, Node next) {this.v = v;this.pre = pre;this.next = next;}}
}

相关内容

热门资讯

智慧健康科技(01715.HK... 格隆汇3月31日丨智慧健康科技(01715.HK)公布年度业绩,2025年度,收益由截至2024年1...
联合利华160亿美元大动作,揭...   核心要点联合利华将食品业务与香料巨头味好美合并的计划,正值快消行业奋力维持市场地位之际。支撑大型...
中欧瑞丰灵活配置混合(LOF)... 核心财务数据:净利润增长显著 净资产与份额双降主要会计数据与财务指标2025年,中欧瑞丰灵活配置混合...
佰泽医疗(02609.HK)2... 格隆汇3月31日|佰泽医疗(02609.HK)公布年度业绩,2025年度,集团实现营收约人民币11....
振江股份(603507.SH)... 振江股份(603507.SH)披露2025年年度报告,报告期公司实现营收39.71亿元,同比增长0....