演習-Niukeシミュレートされたシャッフル

題名

  • リンク: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--;
            }
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_45665172/article/details/110941204