0

サークルの合計:

時計回りに1,2、...、Nの番号が付けられたN人の子供が円に沿って座っています。i番目の子供には、番号aiが書かれた一枚の紙があります。彼らは次のゲームをします:

最初のラウンドでは、xの番号が付けられた子は、彼の番号に隣人の番号の合計を追加します。第2ラウンドでは、時計回りの順序で次の子が自分の数に隣人の数の合計を加算します。Mラウンドがプレイされた後、ゲームは終了します。

入力:

最初の行には、テストケースの数であるTが含まれています。Tケースが続きます。テストケースの最初の行には、スペースで区切られた2つの整数NとMが含まれています。次の行にはN個の整数が含まれており、i番目の数値はaiです。

出力:

テストケースごとに、それぞれN個の整数を持つN行を出力します。i番目の行のj番目の整数には、最初のラウンドをプレイする子iでゲームが開始された場合に、j番目の子が終了する数値が含まれます。最後のテストケースを除く各テストケースの後に空白行を出力します。数値は非常に大きくなる可能性があるため、1000000007を法として出力します。

制約:

1 <= T <= 15

3 <= N <= 50

1 <= M <= 10 ^ 9

1 <= ai <= 10 ^ 9

サンプル入力:

2

5 1

10 20 30 40 50

3 4

1 2 1

サンプル出力:

80 20 30 40 50

10 60 30 40 50

10 20 90 40 50

10 20 30120 50

10 20 30 40100

23 7 12

11 21 6

7 13 24

これは、INterviewStreetの問題です。私はロジックを作成し、そのロジック全体を1つのメソッドに保持するときに正常に機能しました。しかし、2つのメソッドを使用してそれを実行しようとすると、「main」メソッドの配列「b」が「mtd」メソッドの配列「a」によって上書きされます。私は最善を尽くしましたが、それを引き起こしているものを見つけることができませんでした。

import java.util.Scanner;
public class Solution{ 
    public static void main(String[] args) {
    Solution obj = new Solution();
        Scanner sc = new Scanner(System.in);
        int n,k; // Variables
    long m;
    int t = sc.nextInt();
           for(int rot=0;rot<t;rot++) {
            n = sc.nextInt(); // reading input
            m = sc.nextLong(); // reading input
            long[] b = new long[n]; 
            for(int i =0; i< n; i++)
               b[i] = sc.nextLong(); // Reading values into array
                for(int i=0; i< n;i++ ){  // Loop
                obj.mtd(b,i,n,m); // calling Method "mtd"
            System.out.println();
            }
            System.out.println();
        }
    }
         void mtd(long[] a, int j,int n, long m) // "mtd" method
    {

            int p=0;        
                for(; p< m && j<n; j++,p++){     // logic
                    if(j==0){
                        a[0]= a[0]+a[1]+a[n-1];
                    }else if(j==n-1){
                        a[n-1]= a[0]+a[n-2]+a[n-1];
                    }else{
                        a[j]= a[j-1]+a[j]+a[j+1];
                    }
               }
                do{
                    if(j == n){                 // 
                    for(j=0; p< m && j< n; j++,p++){
                         if(j==0){
                                a[0]= a[0]+a[1]+a[n-1];
                        }else if(j==n-1){
                                a[n-1]= a[0]+a[n-2]+a[n-1];
                        }else{
                                a[j]= a[j-1]+a[j]+a[j+1];
                        }
                   }
            }
            }while(p!=m);
                long z;
             for(int k =0; k< n; k++){
                z=a[k]%1000000007;
                 System.out.print(z+" ");    // printing array after all operations
             }
    }
}

私が得ている出力は次のとおりです。

80 20 30 40 50

80130 30 40 50

80130200 40 50

80130200290 50

80130200290420

23 7 12

142 261 77

883 1624 2987

4

2 に答える 2

2

Javaは値渡しですが、を渡すObjectと、オブジェクトへの参照の値が渡されます。の内容に変更を加えた場合にこの参照を使用するObjectと、変更が反映されます。

また、JavaではsArrayはsとして扱われます。Object

のコピーを渡して操作する場合は、最初にSystem.arraycopy()メソッドArrayを使用してコピーを作成してから、のコピーを渡します。これが例です。Array

于 2012-06-20T06:36:28.557 に答える
1

配列をコピーしてから、そのコピーをパラメーターとして渡します。

int[] ints = new int[x];
...
int[] intsCopy = new int[ints.length];
System.arrayCopy(ints, 0, intsCopy 0, ints.length);
someMethod(intsCopy);

これは、@KazekageGaaraが回答で記述したオブジェクトを処理するときのJavaの動作のために必要です。

于 2012-06-20T06:49:01.490 に答える