繁体   English   中英

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

[英]Can someone explain how this left rotating array code works?

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

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,以此类推...如果你们可以帮助解释代码的工作原理,将不胜感激。

这里,

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,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

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM