題名
- リンク:https://www.nowcoder.com/questionTerminal/5a0a2c7e431e4fbbbb1ff32ac6e8dfa0?toCommentId = 179671
/シャッフルは生活の中で非常に一般的です。今度は、シャッフルのプロセスをシミュレートするプログラムを作成する必要があります。次に、2nカードを上から下に、最初のカード、2番目のカード、3番目のカード、および2nカードをシャッフルする必要があります。まず、2n枚のカードを2つの山に分け、1枚目からn枚目のカードを左手(上半分)に持ち、n + 1枚目から2n枚目のカード(下半分)を右手に持ちます。次に、カードをシャッフルするプロセスを開始します。最初に右手に最後のカードを置き、次に左手に最後のカードを置き、次に右手に最後から2番目のカードを置き、次に左手に最後から2番目のカードを置きます。最後に左手が落ちるまで最初のカード。次に、カードをマージします。たとえば、6枚のカードがあり、最初のカードの順序は1、2、3、4、5、6です。まず、左手に1、2、3を持ち、右手に4、5、6を持ち、2つのグループに分けます。シャッフルプロセスでは、6、3、5、2、4、1が順番に配置されました。これらの6枚のカードを再びカードのセットに組み合わせた後、このカードのセットを上から下の順序で見て、1、4、2、5、3、6のシーケンスになります。元のデッキが与えられたので、このデッキをk回シャッフルした後、上から下にシーケンスを出力してください。/
入力の説明:
最初の行の数値T(T≤100)。データグループの数を示します。データの各グループについて、最初の行には2つの数値n、k(1≤n、k≤100)があり、次の行には2nの数値a1、a2、...、a2n(1≤ai≤1000000000)があります。元のデッキの上から下へのシーケンスを表します。
出力の説明:
データのグループごとに、1行と最終シーケンスを出力します。数字はスペースで区切り、行末に余分なスペースを出力しないでください。
実施例1
入力
3
3 1
1
2
3
4
5
6
3 2
1
2
3
4
5
6
2 2
1
1
1
1
出力
1 4 2 5 3 6
1 2 3 4 5 6
1 1 1 1
回答
- カードをk回シャッフルします。これは、同じ法則に従って各カードの位置をk回変更するのと同じです。次に、入力時にk回後にその位置を決定し、データを対応する位置に配置するだけです。
- 1.左側のカードの次の位置は、2 *現在の添え字です。
- 2.右側のカードの次の位置は2 *(現在の添え字-n + 1)-1に等しくなります。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
//1.开始输入
int num = scan.nextInt();// num组数据
//2.单独处理每一组数据
while(num > 0){
//3.首先把n和k拿出来
int n = scan.nextInt();
int k = scan.nextInt();
//4.设置一个数组,用来放2*n张牌
int[] arr = new int[2*n];
for(int i = 0;i < 2*n;i++){
int tmp = i;//用tmp先标记牌的首次位置,然后最后表示k次之后的位置
for(int j = 0;j < k;j++){
//每一张牌都是有规律的变k次
if(tmp < n){
tmp = 2*tmp;
}else{
tmp = 2*(tmp-n+1)-1;
}
}
arr[tmp] = scan.nextInt();
}
//5.经过循环之后一组数据就已经放好了,现在要输出,输出的时候有空格
System.out.print(arr[0]);
for(int i = 1;i < 2*n;i++){
System.out.print(" "+arr[i]);
}
//6.一组数据输完要进行换行
System.out.println();
//7.开始进行下一组数据的处理,num代表的是组数,那么就num--;
num--;
}
}
}
}