0

我需要反转大数组,使第一个元素成为最后一个元素,最后一个元素成为第一个元素。

到目前为止,我通过创建这个数组的副本来做到这一点,然后在原始数组上向后迭代并写入副本。之后,将副本写回原件。

通过同时访问第一个和最后一个元素,将其中一个元素存储在临时变量中并交换值,是否可以在一个循环中安全地执行此操作?

4

4 回答 4

8

可能最有效的方法是使用就地算法,例如下面的算法(相当于这里的维基百科文章):

for (int ix = 0; ix < len / 2; ix++) {
    int t = arr[ix];
    arr[ix] = arr[len - ix - 1];
    arr[len - ix - 1] = t;
}
于 2012-08-19T16:42:54.927 回答
3

对于整数类型,更好的方法是......

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 个字节。

于 2012-08-19T17:07:11.000 回答
2
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;
}
于 2012-08-19T16:46:00.450 回答
0

您可以使用 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;

}

于 2021-06-16T03:25:14.557 回答