有人可以解释这个左旋转数组代码如何工作吗?

时间:2019-06-26 02:14:30

标签: java arrays

我正在尝试学习有关数组以及如何旋转数组的更多信息。我偶然发现了一个代码,试图找出它如何正确打印出旋转。

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}

  1. (1 + 4)%5 = 5%5 = 0
  2. (2 + 4)%5 = 6%5 = 1
  3. (3 + 4)%5 = 7%5 = 2
  4. (4 + 4)%5 = 8%5 = 3
  5. (5 + 4)%5 = 9%5 = 4

它打印出来的答案是5 1 2 3 4这是正确的,但是根据我的计算,它应该打印为1 2 3 45。我是怎么得到的是从以下计算中得出的结论是1应该转到索引0、2应该转到索引1,依此类推...如果你们可以帮助解释代码的工作原理,那将不胜感激。

2 个答案:

答案 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

希望这会有所帮助