循环求和:
有 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