输入第一行表示组数,
第二行输入 N,K
每一组 2*N+1 张牌, 操作 K 次, 输出序列按照从上到下.
操作含义: 把一组牌分为两等分, 左手一份右手一份, 右手先出最后一张牌, 左手再出最后一张牌, 一次循坏, 直到出完牌.
输出需注意: 行末数据不能留空格, 所以需要和前面数据分开打印.
知识点: 用到 list 来调换数组中元素顺序并暂存, 最后在挪到原数组中.
- import java.util.ArrayList;
- import java.util.Scanner;
- public class WashCard {
- // 数的范围自己无须做特殊处理, 表示测试用例会那样做
- public static void main(String[] args) {
- Scanner in=new Scanner(System.in);
- int T=in.nextInt();// 数据组数
- for(int i=0;i<T;i++){
- int n=in.nextInt();
- int k=in.nextInt();
- int[] arr=new int[2*n];
- for(int j=0;j<2*n;j++){
- arr[j]=in.nextInt();
- }
- // 反转 K 次
- for(int times=0;times<k;times++){// 操作 K 次
- getRes(arr,arr.length);// 操作一次
- }
- for(int a=0;a<2*n-1;a++){// 没有打印最后一个数, 因为最后一个数分开处理, 后面不能打印空格
- System.out.print(arr[a]+" ");
- }
- System.out.println(arr[2*n-1]);
- }
- }
- public static void getRes(int[] arr,int n){
- ArrayList<Integer> list=new ArrayList<>();// 借助 list 完成数组中元素顺序. 再放回原数组中
- for(int i=0;i<n/2;i++){
- list.add(arr[i]);
- list.add(arr[i+n/2]);
- }// 一次后的从上到下
- for(int i=0;i<n;i++){
- arr[i]=list.get(i);//list 中值移到原数组 arr 中
- }
- }
- }
来源: http://www.bubuko.com/infodetail-3304369.html