翻转数组,就是要把数组中元素的顺序全部反过来。比如一个数组{1,2,3,4,5,6,7,8},翻转之后就是{8,7,6,5,4,3,2,1}。
- (1)另外创建数组,反向填入元素
数组是将元素按照顺序依次存放的,长度固定。所以如果想要让数组“翻转”,一种简单的思路是:直接创建一个相同长度的新数组,然后遍历所有元素,从末尾开始依次反向填入就可以了。
#include<iostream>
using namespace std;int main()
{const int n = 8;int arr[n] = { 1,2,3,4,5,6,7,8 };// 1. 直接创建一个新数组,遍历元素反向填入int newArr[n];for (int i = 0; i < n; i++){newArr[n-i-1] = arr[i];} // 打印数组for (int i = 0; i < n; i++){cout << newArr[i] << "\t";}cout << endl;}
需要注意原数组下标为i的元素,对应翻转后的新数组下标为n-i-1(n为数组长度)。
- (2)基于原数组翻转
另建数组的方式很容易实现,但有明显的缺点:需要额外创建一个数组,占用更多的内存。最好的方式是,不要另开空间,就在原数组上调整位置。
这种思路的核心在于:我们应该有两个类似“指针”的东西,每次找到头尾两个元素,将它们调换位置;而后指针分别向中间逼近,再找两个元素对调。由于数组中下标是确定的,因此可以直接用下标代替“指针”。
#include<iostream>
using namespace std;int main()
{const int n = 8;int arr[n] = { 1,2,3,4,5,6,7,8 };// 2. 双指针分别指向数组头尾,元素对调int head = 0, tail = n - 1; while(head < tail){int temp = arr[head]; arr[head] = arr[tail];arr[tail] = temp;// 指针向中间移动++head;--tail;}// 打印数组for (int i = 0; i < n; i++){cout << arr[i] << "\t";}cout << endl;}
结果输出: