核心思路:一个数最后到底是在左边还是右边,取决于它在输入的数据里面最后一次出现时是L(左移)还是R(右移)
我们先将输入的数据存入2个数组中,然后从后往前遍历,每遇到一个数就先判断它之前有没有被遇到过,如果先前有
被遇到则跳过这个数(因为先进行的操作会被后进行的操作覆盖掉),如果这个数先前没有被遇到过,则看它对应的的
操作是左移还是右移,分别存入对应的的数组中去,并将它标记为true。遍历完成后我们会得到2个数组,一个是left
(正序输出),另一个则是right(倒序输出)。对于中间的没有被操作过的数字,我们只需去遍历一遍状态数组,找到其
中值为false的值即可,这些值就是中间的未被操作的数,只需按顺序输出即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
String[] str=new String[m+5];
int[] arr=new int[m+5];
for(int i=0;i<m;i++) {
str[i]=input.next();
arr[i]=input.nextInt();
}
boolean[] ok=new boolean[n]; //标记每个数有没有被操作过
int[] left=new int[m+5];int l=0;
int[] right=new int[m+5];int r=0;
for(int i=m-1;i>=0;i--) {
if(ok[arr[i]-1]==false) {
ok[arr[i]-1]=true;
if("L".equals(str[i])) left[l++]=arr[i];
else right[r++]=arr[i];
}
}
for(int i=0;i<l;i++) { //左边的
System.out.print(left[i]+" ");
}
for(int i=0;i<ok.length;i++) {
if(ok[i]==false) { //中间的
System.out.print((i+1)+" ");
}
}
for(int i=r-1;i>=0;i--) { //右边的(倒序输出)
System.out.print(right[i]+" ");
}
}
}
大佬,为什么left是正序遍历,left不应该是倒序遍历吗?
大佬,请问这啥比赛,有网址吗
.
这个
嗯,感谢😊
2022蓝桥杯国赛