输入包括多组测试数据,每组数据的第一行包括两个数 n和k。n表示牌的数目,1<n<1000,k表示下面要进行的操作数量。随后的k行,每行一个整数x,1<=x<=n,表示从第几个位置开始移位。在每一次shift操作后都接一个flip操作。
对于输入的每组数据,计算经过给定的k次shift和flip操作后,各个位置的数值。并按次序在一行上输出所有牌张的值,每个数值(不包括最后一个)后面有一个空格。
6 1 4 0 0
1 6 5 2 3 4
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int n=sc.nextInt(); int k=sc.nextInt(); if(n==0)break; List<Integer>list=new ArrayList<>(); for(int i=1;i<=n;i++) list.add(i); while(k-->0) { int x=sc.nextInt(); list=reverse(list,x); list=filp(list); } System.out.print(list.get(0)); for(int i=1;i<n;i++) System.out.print(" "+list.get(i)); System.out.println(); } } private static List<Integer> filp(List<Integer> list) { List<Integer>after=new ArrayList<>(); int len; if(list.size()%2==0) len=list.size()/2; else len=(list.size()-1)/2; for(int i=0;i<len;i++) after.add(list.get(i)); Collections.reverse(after); for(int i=len;i<list.size();i++) after.add(list.get(i)); return after; } private static List<Integer> reverse(List<Integer> list, int x) { List<Integer>after=new ArrayList<>(); for(int i=x;i<list.size();i++) after.add(list.get(i)); for(int i=0;i<x;i++) after.add(list.get(i)); return after; } }