0

循环求和:

有 N 个孩子围坐在一个圆圈上,顺时针编号为 1,2,...,N。第 i 个孩子有一张纸,上面写着数字 ai。他们玩以下游戏:

在第一轮中,编号为 x 的孩子将他的邻居的数字之和加到他的数字上。在第二轮中,顺时针顺序的下一个孩子将他的邻居的数字之和加到他的数字上,依此类推。游戏在M轮结束后结束。

输入:

第一行包含 T,即测试用例的数量。T 案例如下。测试用例的第一行包含两个空格分隔的整数 N 和 M。下一行包含 N 个整数,第 i 个数字是 ai。

输出:

对于每个测试用例,输出 N 行,每行有 N 个整数。第 i 行的第 j 个整数包含第 j 个孩子结束的数字,如果游戏从孩子 i 玩第一轮开始。在除最后一个之外的每个测试用例之后输出一个空行。由于数字可能非常大,因此以 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 30 120 50

10 20 30 40 100

23 7 12

11 21 6

7 13 24

这是 INInterviewStreet 中的一个问题。我编写了一个逻辑并成功地将整个逻辑保留在 One 方法中。但是当我尝试通过使用两种方法来做到这一点时,“main”方法中的 Array 'b' 被“mtd”方法中的 Array '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

80 130 30 40 50

80 130 200 40 50

80 130 200 290 50

80 130 200 290 420

23 7 12

142 261 77

883 1624 2987

4

2 回答 2

2

Java 是按值传递的,但是当您传递 时Object,对对象的引用的值会被传递。如果您对 的内容进行任何更改,则使用此参考Object,更改将被反映回来。

并且s在 JavaArray中被视为s。Object

如果您打算传递您的副本Array并使用它,请首先使用System.arraycopy()方法创建一个副本,然后传递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);

这是必要的,因为 Java 在处理@KazekageGaara 在他的回答中描述的对象时的行为。

于 2012-06-20T06:49:01.490 回答