圈子总结:
有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
答案 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描述的对象时的行为。