web-dev-qa-db-ja.com

配列の逆順

Javaで配列の順序を逆にしようとしています。
最小のメモリ使用量でO(n))を実行する最も効率的な方法は何ですか。
コードで答える必要はありません。擬似コードで問題ありません。
これが私の思考プロセスです。

  create a new temp array //I think this is a waste of memory, 
                          //but I am not sure if there's a better way
 grab elements from the end of the original array -decrement this variable
 insert element in beginning of temp array -increment this variable
then make the original array point to the temp array? //I am not sure 
            //if I can do this in Java; so let's say the 
            //original array is Object[] arr; and the temp array is 
            //Object[] temp. Can I do temp = arr; ?

おそらく一時配列を使用せずにこれを行うより効率的な方法はありますか?最後に、配列にnullがないため、すべてが機能すると仮定します。ありがとうございました

編集:いいえ、これは宿題ではありません。

19
marcwho

Object配列の場合、Collections.reverse(Arrays.asList(array))は一定のメモリと線形時間でジョブを実行します。一時的な配列は不要です。

53
Louis Wasserman

一時配列を使用する必要はありません。配列を最初から途中までステップスルーして、iの要素をarray.length-i-1の要素と交換します。中央の要素を正しく処理するようにしてください(難しくはありませんが、確認してください)。

12

単一のtemp要素を使用します。

int array[SIZE];
int temp;

for (int i = 0; i < SIZE/2; i++)
  {
     temp = array[i];
     array[i] = array[SIZE-1 - i];
     array[SIZE-1 - i] = temp;
  }
11
ArjunShankar

一時配列を必要とせずにそれを行うことができます

  • 配列の始めから終わりまで(または終わりは関係ありません)ループします
  • 要素を(最後の要素-インデックス)の要素と交換します(so 0とsize - 1、1およびsize - 2 etc)
  • スワップするには、次のようなことをします。
 temp = a [i]; 
 a [i] = a [end-i]; 
 a [end-i] = temp; 
  • 繰り返す
3
twain249

2つのソリューションがあります。

    loop to N/2
      swap each element at i with element at N - i

別の解決策は、(状況に応じて)インデックスを作成して配列を逆にすることです:

    GetValueAt(int i){return array[N - i];}
1
SirGuy

配列が整数の配列であると考えてみましょう。次に、このような解決策を探すこともできます

arr-整数の配列

for(int i=0,int J<arr.length-1 ; i<j ; i++,j--)
{
    temp =a[i];
    a[i]=a[j];
    a[j]=temp;
 }
0
Andy

0ベースのインデックス配列を想定した擬似コード:

for i in range(0, len(array)/2):
     swap(array[i], array[(len(array)-1)-i])
0
mcfinnigan