调用方法中的数组通过被调用的方法数组重写而没有任何return语句

时间:2012-06-20 06:27:30

标签: java methods parameter-passing

圈子总结:

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

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

输入:

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

输出:

对于每个测试用例,输出N行,每行有N个整数。第i行的第j个整数包含第j个孩子最终的数字,如果游戏以第一轮的第一轮比赛开始。在每个测试用例之后输出一个空白行,除了最后一个。由于数字可能非常大,因此输出模数为1000000007。

约束:

1 <= T <= 15

3 <= N <= 50

1 <= M <= 10 ^ 9

1&lt; = ai&lt; = 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

这是INterviewStreet中的一个问题。我写了一个逻辑,并在将整个逻辑保存在One方法中时成功运行。 但是当我尝试使用两种方法时,“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

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

2 个答案:

答案 0 :(得分:2)

Java是按值传递的,但是当您传递Object时,会传递对象引用的值。如果您对Object的内容进行任何更改,请使用此引用,这些更改会反映出来。

Array在Java中被视为Object

如果您打算传递Array的副本并使用它,请先使用System.arraycopy()方法创建副本,然后传递Array的副本。 Here's an example

答案 1 :(得分:1)

复制数组,然后将副本作为参数传递:

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

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