Array Rotation in Java

2025年3月29日 | 阅读 6 分钟

在本节中,我们将学习什么是数组旋转以及如何通过 Java 程序旋转数组。

Java 数组旋转

数组旋转简单来说就是将数组的元素移动到指定的位置。我们可以向两个方向旋转数组,即顺时针和逆时针。我们可以对数组执行任意次数的旋转。

旋转类型

  • 左旋
  • 右旋

左旋

在左旋中,数组元素会向左移动指定的位数。它以顺时针方向旋转数组。在旋转中,索引最小的元素会移动到索引最大的位置。

Array Rotation in Java

示例

假设,[1, 2, 3, 4, 5] 是一个数组,我们需要对数组执行2 次左旋,则数组将变为

给定数组 = [1, 2, 3, 4, 5]

第一次左旋后的数组 = [2, 3, 4, 5, 1]

第二次左旋后的数组 = [3, 4, 5, 1, 2]

ArrayLeftRotation.java

输出

Array Rotation in Java

右旋

在右旋中,数组元素会向右移动指定的位数。它以逆时针方向旋转数组。

Array Rotation in Java

示例

假设 [4, 7, 9, 0, 1] 是一个数组,我们需要对数组执行2 次左旋,则数组将变为

给定数组 = [4, 7, 9, 0, 1]

第一次左旋后的数组 = [1, 4, 7, 9, 0]

第二次左旋后的数组 = [0, 1, 4, 7, 9]

ArrayRightRotation.java

输出

Array Rotation in Java

如何旋转数组?

有以下四种旋转数组的方法

  • 使用临时数组
  • 逐个旋转元素
  • 使用杂耍算法
  • 通过反转数组

使用临时数组

输入数组[] = [11, 22, 33, 44, 55],旋转次数 (r) = 2,元素数量 (n) = 5

1. 将前 r 个元素存储在临时数组中。

2. 将其余数组向左移动。

3. 之后,将临时数组[]的元素追加到数组[]。

逐个旋转元素

使用杂耍算法

杂耍算法是第二种方法(逐个旋转元素)的进阶版本。该算法将整个数组划分为不同的集合。我们可以通过查找 rn 的 GCD 来找到集合的数量。在获得集合后,在集合内移动元素。让我们通过一个例子来理解该算法。

假设,a[] 是一个包含 12 (n) 个元素的数组(1, 2, 3,……, 12),我们需要执行 3 (d) 次旋转,则根据算法

n 和 d 的 GCD = 3

元素首先在第一个集合中移动。移动后,我们得到以下数组

{4, 2, 3, 7, 5, 6, 10, 8, 9, 1, 11, 12}

第二个集合中的元素移动。

{4, 5, 3, 7, 8, 6, 10, 11, 9, 1, 2, 12}

最后,第三个集合中的元素移动。

{4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3}

让我们用 Java 程序来实现上述方法。

JugglingAlgo.java

输出

Array Rotation in Java

通过反转数组

思路是反转输入数组的最后 k 个元素,然后反转剩余的 n-k 个元素。使用这种机制,通过反转整个数组,我们可以得到右旋后的数组。

RotateReverse.java

输出

Array Rotation in Java