我需要反转大数组,使第一个元素成为最后一个元素,最后一个元素成为第一个元素。
到目前为止,我通过创建这个数组的副本来做到这一点,然后在原始数组上向后迭代并写入副本。之后,将副本写回原件。
通过同时访问第一个和最后一个元素,将其中一个元素存储在临时变量中并交换值,是否可以在一个循环中安全地执行此操作?
可能最有效的方法是使用就地算法,例如下面的算法(相当于这里的维基百科文章):
for (int ix = 0; ix < len / 2; ix++) {
int t = arr[ix];
arr[ix] = arr[len - ix - 1];
arr[len - ix - 1] = t;
}
对于整数类型,更好的方法是......
int arr[5]={1,2,3,4,5};
int c=0,d=sizeof(arr)/sizeof(*arr)-1;
for(;c<d;c++)
{
arr[c] ^= arr[d-c];
arr[d-c] ^= arr[c];
arr[c] ^= arr[d-c];
}
由于 XOR 是一字节指令,因此交换线几乎不需要 3 个字节。
int Array[100];
unsigned int i, j;
for (i=0, j=100-1; i<j; i++, j--)
{
int t;
t = Array[j];
Array[j] = Array[i];
Array[i] = t;
}
您可以使用 reverse() 函数,或者我认为这将是非常简单的解决方案
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
unsigned int arr[n];
for(int i = 0; i < n; i++)
{
cin>>arr[i];
}
while(n)
{
cout<<arr[n-1]<<" ";
n--;
}
return 0;
}