如何在 Java 中反转数组

2025年5月2日 | 阅读 10 分钟

在本教程中,我们将讨论如何在 Java 中反转数组。输入是一个整数数组,任务是反转输入数组。反转数组意味着输入数组的最后一个元素将成为反转数组的第一个元素,输入数组的倒数第二个元素将成为反转数组的第二个元素,依此类推。观察以下示例。

示例 1

输入

arr[] = {1, 2, 3, 4, 5, 6, 7, 8}

输出

arr[] = {8, 7, 6, 5, 4, 3, 2, 1}

示例 2

输入

arr[] = {4, 8, 3, 9, 0, 1}

输出

arr[] = {1, 0, 9, 3, 8, 4}

方法 1:使用辅助数组

我们可以从后向前遍历数组,即反向遍历,并将循环索引指向的元素存储在辅助数组中。辅助数组现在包含输入数组的反转元素。之后,我们可以在控制台上显示辅助数组。请看以下程序。

文件名: ReverseArr.java

输出

For the input array: 
1 2 3 4 5 6 7 8 
The reversed array is: 
8 7 6 5 4 3 2 1 
 
For the input array: 
4 8 3 9 0 1 
The reversed array is: 
1 0 9 3 8 4

复杂度分析:需要一个 for 循环来反转数组,这使得程序的时间复杂度为 O(n)。此外,需要一个辅助数组来反转数组,这使得程序空间复杂度为 O(n),其中 n 是数组中的总元素数量。

方法 2:使用双指针

我们也可以使用两个指针来反转输入数组。第一个指针将指向数组的第一个元素。第二个指针将指向输入数组的最后一个元素。现在我们将开始交换这两个指针指向的元素。交换后,第二个指针将向左移动,第一个指针将向右移动。当这两个指针相遇或交叉时,我们停止交换,得到的数组就是输入数组的反转数组。

文件名: ReverseArr1.java

输出

For the input array: 
1 2 3 4 5 6 7 8 
The reversed array is: 
8 7 6 5 4 3 2 1 
 
For the input array: 
4 8 3 9 0 1 
The reversed array is: 
1 0 9 3 8 4

复杂度分析:程序的时间复杂度与上一个程序相同。程序中没有使用额外空间,因此程序空间复杂度为 O(1)。

方法 3:使用栈

由于栈遵循 LIFO(后进先出)原则,因此可以用于反转输入数组。我们所要做的就是从左到右将输入数组的所有元素放入栈中。我们将使用循环来完成此操作。

文件名: ReverseArr2.java

输出

For the input array: 
1 2 3 4 5 6 7 8 
The reversed array is: 
8 7 6 5 4 3 2 1 
 
For the input array: 
4 8 3 9 0 1 
The reversed array is: 
1 0 9 3 8 4

复杂度分析:程序的时间复杂度与上一个程序相同。程序中使用了栈,因此程序空间复杂度为 O(n)。

使用递归

也可以通过递归来实现相同的结果。观察以下内容。

文件名: ReverseArr3.java

输出

For the input array: 
1 2 3 4 5 6 7 8 
The reversed array is: 
8 7 6 5 4 3 2 1 
 
For the input array: 
4 8 3 9 0 1 
The reversed array is: 
1 0 9 3 8 4

解释:语句 reverseArr.add(arr[i]); 写入在递归调用进入栈之后(请注意,在这种情况下栈是隐式的)。因此,当递归调用中的基本情况命中时,栈会展开,栈中的任何内容都会弹出。最后一个元素在最后一次递归调用期间进入栈。因此,最后一个元素首先被弹出。然后弹出倒数第二个元素,依此类推。语句 reverseArr.add(arr[i]); 存储了那个弹出的元素。最后,我们显示存储在列表 reverseArr 中的元素。

复杂度分析:与方法 3 的第一个程序相同。

方法 4:使用 Collections.reverse() 方法

可以使用内置的 Collections.reverse() 方法来反转列表。其用法在以下程序中显示。

文件名: ReverseArr4.java

输出

For the input array: 
1 2 3 4 5 6 7 8 
The reversed array is: 
8 7 6 5 4 3 2 1 
 
For the input array: 
4 8 3 9 0 1 
The reversed array is: 
1 0 9 3 8 4

复杂度分析:程序使用 Collections.reverse() 方法以线性时间反转列表,因此程序的时间复杂度为 O(n)。程序使用列表,因此程序空间复杂度为 O(n),其中 n 是数组中的总元素数量。

注意 1:Collections.reverse() 方法也用于反转链表。

注意 2:上面讨论的所有方法都适用于不同的数据类型。

方法 5:使用 StringBuilder.append() 方法

从标题可以看出,此方法适用于字符串数组。使用 StringBuilder.append() 方法,我们可以反转字符串数组。我们所要做的就是从后向前开始追加数组的字符串元素。

文件名: ReverseArr5.java

输出

For the input array: 
javaTpoint is the best website 
The reversed array is: 
website best the is javaTpoint 
 
For the input array: 
India is my country 
The reversed array is: 
country my is India

复杂度分析:程序的时间和空间复杂度与上一个程序相同。