翻转数组,就是要把数组中元素的顺序全部反过来。比如一个数组{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;
}
结果输出: