解题思路:
我们用两个list 记录一下左移的数 和 右移的数 但是 一个数可能重复移动多次 所以针对这种情况 开一个int数组记录一下最后一次这个数是左移还是右移 左移我们赋值为1 右移赋值为2 如果没移动 保持0即可
对于记录左移的数的list我们命名成l 对于l来说:
因为越往后左移的数越先输出 所以倒序遍历一下l,开一个boolean数组记录一下这个数有没有被输出,判断一下在int数组状态是否是1 并且没有被用过 就输出 然后把i标记成已使用
对于记录右移的数的list我们命名成r 对于r来说:
因为越往后右移的数靠后输出,所以正序遍历r,注意一下,一个数可能多次右移,所以首先开一个HashMap,判断一下在int数组状态是否为2 如果是2 hashMap里面存储 key是当前数 value 是下标,遍历完把hashMap排序一下,然后顺序输出即可。
注意事项: 主要问题是一个数可能被多次移动,所以需要判断这个数在左移列表里面和右移列表里面不同情况。
参考代码:
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception{ BufferedReader cin = new BufferedReader(new InputStreamReader(System.in)); String[] s = cin.readLine().split(" "); int n = Integer.parseInt(s[0]); int m = Integer.parseInt(s[1]); List<Integer> l = new ArrayList<>(); List<Integer> r = new ArrayList<>(); int[] status = new int[n + 1]; boolean[] used = new boolean[n + 1]; while(m -- > 0) { s = cin.readLine().split(" "); String s1 = s[0]; int x = Integer.parseInt(s[1]); if(s1.equals("L")) { l.add(x); status[x] = 1; } else { r.add(x); status[x] = 2; } } for(int i = l.size() - 1; i >= 0; i--) { if(!used[l.get(i)] && status[l.get(i)] == 1) { System.out.print(l.get(i) + " "); used[l.get(i)] = true; } } for(int i = 1; i <= n; i++) { if(status[i] == 0) System.out.print(i + " "); } HashMap<Integer, Integer> hashMap = new HashMap<>(); for(int i = 0; i < r.size(); i++) { if(!used[r.get(i)] && status[r.get(i)] == 2) { hashMap.put(r.get(i), i); } } List<Integer> sorted = new ArrayList<>(hashMap.values()); Collections.sort(sorted); for(int key : sorted) { System.out.print(r.get(key) + " "); } } }
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复