【问题标题】:Array in calling method getting over writed by called method array without any return statement调用方法中的数组被调用方法数组覆盖而没有任何返回语句
【发布时间】:2012-06-20 06:27:29
【问题描述】:

圆求和:

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

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

输入:

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

输出:

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

约束:

1

3

1

1

示例输入:

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

【问题讨论】:

    标签: java methods parameter-passing


    【解决方案1】:

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

    Arrays 在 Java 中被视为Objects。

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

    【讨论】:

    • @Gaara 那么我们如何传递一个数组而不反映对它的修改..
    • 您没有“传递对象”。对象不是值。你传递了一个参考。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2017-08-14
      • 1970-01-01
      相关资源
      最近更新 更多