我正在尝试学习有关数组以及如何旋转数组的更多信息。我偶然发现了一个代码,试图找出它如何正确打印出旋转。
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
int n = sc.nextInt();
int d = sc.nextInt();
int arr [] = new int [n];
for (int i = 0; i < n; i++)
{
arr [i] = sc.nextInt();
}
for (int i = 0; i < n; i++)
{
System.out.print (arr [(i + d) % n] + " ");
}
}
我曾尝试自己做数学运算以查看其工作原理,但它并没有加起来,我不确定自己做错了什么。 n是数组中整数的个数,d是转数。
等式为:(i + d)%n,n = 5,d = 4,数组为{1,2,3,4,5}
它打印出来的答案是5 1 2 3 4这是正确的,但是根据我的计算,它应该打印为1 2 3 45。我是怎么得到的是从以下计算中得出的结论是1应该转到索引0、2应该转到索引1,依此类推...如果你们可以帮助解释代码的工作原理,那将不胜感激。
答案 0 :(得分:0)
在这里
for (int i = 0; i < n; i++)
{
System.out.print (arr [(i + d) % n] + " ");
}
该数组将从0开始,因为在for循环中您将i设置为0。因此它将从0开始至4。
(0 + 4) % 5 = 4 % 5 = 5
(1 + 4) % 5 = 5 % 5 = 1
(2 + 4) % 5 = 6 % 5 = 2
(3 + 4) % 5 = 7 % 5 = 3
(4 + 4) % 5 = 8 % 5 = 4
答案 1 :(得分:0)
首先,您收集内容为{1,2,3,4,5}
的数组,这意味着您有5个具有详细信息的索引:
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
然后,您希望将每个索引内容添加到值d
,然后将模数%
添加到值n
。
第二次迭代出了什么问题?
for (int i = 0; i < n; i++){
System.out.print (arr [(i + d) % n] + " ");
}
如果打印此(i + d)% n
,它将产生以下内容:
(0 + 4) % 5 = 4
(1 + 4) % 5 = 0
(2 + 4) % 5 = 1
(3 + 4) % 5 = 2
(4 + 4) % 5 = 3
因此,使用此命令:
System.out.print (arr [(i + d) % n] + " ");
实际上您正在打印:
arr[4]
arr[0]
arr[1]
arr[2]
arr[3]
因此,如果要获得所需的结果,请使用以下代码通过保存数组的每个索引的值来更改第二次迭代:
for (int i = 0; i < n; i++){
arr[i] = (arr[i] + d) % n;
System.out.print(arr[i] + " ");
}
这将打印0 1 2 3 4
希望这会有所帮助