Java 中的块交换算法或数组旋转

2024 年 9 月 26 日 | 阅读 6 分钟

这是经常在 Google、Amazon、TCS、Accenture 等顶级 IT 公司面试中出现的非常有趣的问题。通过解决这个问题,可以考察面试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将讨论 **Java 中的块交换算法和数组旋转**,并提供不同的方法和逻辑。此外,我们还将创建相应的 Java 程序。

数组旋转示例

输入

int arr[] = {7, 9, 8, 0, 5, 1, 6, 4}, s = 8, d = 2

输出:result[] = {8, 0, 5, 1, 6, 4, 7, 9}

解释:s 是输入数组的大小。d = 2 意味着我们需要旋转数组 2 次。第一次旋转后,我们得到:

{9, 8, 0, 5, 1, 6, 4, 7}。现在,我们再次旋转数组,得到以下结果:

让我们看另一个例子。

输入

int arr[] = {6, 8, 7, 9, 0, 5, 1, 3, 2, 4}, s = 10, d = 5

输出:result[] = {5, 1, 2, 3, 4, 6, 8, 7, 9, 0}

解释:旋转数组 5 次后,我们得到以下结果:

{5, 1, 2, 3, 4, 6, 8, 7, 9, 0},这就是我们的答案。

块交换算法

在本节中,我们使用了块交换算法来旋转数组。请观察该算法:

步骤 1:将输入数组分成两个子数组,以 div 为分割点。令它们为 A = arr[0 ... div - 1] 和 B = arr[div ... n - 1]。

步骤 2:在 A 和 B 的大小相等之前,执行以下步骤:

  1. 如果 A 的大小大于 B,则将 A 分成两部分,A1 和 A2,使得 A1 的大小等于 A2。交换子数组 A1 和 B。这将使数组从 A1A2B 变为 BA2A1。
  2. 如果 B 的大小大于 A,则将 B 分成两部分,B1 和 B2,使得 B2 的大小与 B 的大小相同。交换子数组 A 和 B2。这将使数组从 AB1B2 变为 B2B1A。

步骤 3:当 A 和 B 的大小相等时,交换它们。

方法:使用递归

以下程序使用了上述算法。

文件名:RotateArray.java

输出

The input array: 
7 9 8 0 5 1 6 4 
The new array after rotating 2 times, we get
8 0 5 1 6 4 7 9 

The input array: 
6 8 7 9 0 5 1 3 2 4 
The new array after rotating 5 times, we get
5 1 3 2 4 6 8 7 9 0