360笔试 2020 8 22 编程第二题
题目意思:
输入N,M。
N表示,有一个序列,1,2,3,4,5...N(N为偶数,但是测试样例好像有奇数TAT...下面的代码也没有过,只是提供一个思路)
M表示接下来输入M个数字,输入的数字只能是1,2
1 表示将序列首元素插入序列尾部
2 表示将序列上将奇偶位置上的元素对调
样例
4 3
1 2 1
解释{1,2,3,4} -> {2,3,4,1} ->{3,2,1,4} -> {2,1,3,4}
思路:用两个list来存奇偶位置上的元素,当操作为1的时候,将输出顺序在前面的list(刚开始是存奇数的list),将其首元素插入到队尾,同时调整奇偶数list的输出顺序
当操作位2的时候,调整奇偶数的输出顺序。最后按照奇偶数的输出顺序输出即可。
代码
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int []A = new int[m];
// 用来存刚开始的奇数位置
Deque<Integer> deque1 = new ArrayDeque<>();
// 用来存刚开始的偶数位置
Deque<Integer> deque2 = new ArrayDeque<>();
// 初始顺序为先输出奇数序列
int order = 1;
for (int i = 0; i < m; i++) {
A[i] = sc.nextInt();
}
// 存入数据
for (int i = 1; i <= n; i++) {
if ( (i & 1) == 1) {
deque1.add(i);
} else {
deque2.add(i);
}
}
for (int i = 0; i < m ; i++) {
// 将队首元素放入队尾,同时更换输出顺序
if (A[i] == 1) {
if (order == 1) {
int temp = deque1.poll();
deque1.addLast(temp);
} else {
int temp = deque2.poll();
deque2.addLast(temp);
}
}
// 更换顺序(将队首元素插到队尾,或者奇偶数调换,都会引起,输出的顺序)
order = (order & 1) == 1 ? 2 : 1;
}
if ((order & 1) == 1) {
System.out.print(deque1.poll() + " " + deque2.poll());
while (!deque1.isEmpty()) {
System.out.print(" " + deque1.poll());
System.out.print(" " + deque2.poll());
}
} else {
System.out.print(deque2.poll() + " " + deque1.poll());
while (!deque1.isEmpty()) {
System.out.print(" " + deque2.poll());
System.out.print(" " + deque1.poll());
}
}
}
}