0

最初の要素が最後になり、最後の要素が最初になるように、大きな配列を逆にする必要があります。

これまでは、この配列のコピーを作成してこれを行い、次に元の配列を逆方向に繰り返してコピーに書き込みました。その後、コピーを元に書き戻します。

最初と最後の要素に同時にアクセスし、それらの1つを一時変数に格納して値を交換することにより、1つのループでこれを安全に行うことは可能ですか?

4

4 に答える 4

8

おそらく最も効率的な方法は、以下のようなインプレースアルゴリズムを使用することです(これは、ここにあるWikipediaの記事のアルゴリズムと同等です)。

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は1バイトの命令であるため、スワップラインに沿って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 に答える