4

値が0,0,0,0,0,0,0,0,1,1,1の配列があります。必要な出力は、各ゼロが奇数インデックスになり、1が偶数インデックスになり、0の場合1 の後にコピーする必要があり、その逆も同様です。出力が 0,1,0,1,0,1,0,0,0,0,0.... になることを意味しますが 、上記の操作は配列の単一パスで実行する必要があります

  • だから私は同じサイズの配列を作成しました、
  • 次に、メイン配列のトラバースを開始し、1 の 0 が発生しました。カウンターを配置して、値を奇数インデックスに設定し、その逆も同様です。
  • 最後に、インデックスが new array created の長さを超えたときに、偶数モードで新しいセルに 0 を後方から追加し始めました。

他のより良い解決策は何ですか。

4

3 に答える 3

5

これには追加の配列は必要ありません。その場で行うことができます。奇数ステップごとに停止するポインターと、1s. 2 番目のポインターが 1 番目のポインターと1ちょうど交換されたら、最初のポインターをインクリメントします。配列の長さに対してこれを行います。

于 2012-04-26T05:07:49.083 に答える
0

ワンパスでインプレースを試してみましょう

配列の先頭に 1 つのポインターを保持し、配列の末尾に 1 つのポインターを保持します。

ゼロの数が 1 の数より多いと仮定しています

int begin = 0, end = length - 1;
while (begin < end){
    if (A[begin] == 0 && A[end] == 1){
        if (begin % 2 != 0){
            int tmp = A[end];
            A[end] = A[begin];
            A[begin] = temp;
            end--;
        }
        begin++;
    }
    else
        break;
}

上記の解決策は、1 の数が 0 の数よりも大きい場合には機能しないことに注意してください。

于 2012-04-26T05:30:28.760 に答える
0
#include<stdio.h>

main()
{
    int arr[]={1,0,0,1,0,1,1,1,0,1};
    int n=10;
    int odd,one,tmp;
    odd=one=0;

    while(true)
    {
        while(odd<n && arr[odd])
            odd+=2;
        while(one<n && (((one<=odd)&&(one%2==0)) || !arr[one]))
            one++;

       if(odd<n && one<n)
       {
           arr[one]=arr[one]^arr[odd];
           arr[odd]=arr[one]^arr[odd];
           arr[one]=arr[one]^arr[odd];
       }
       else
           break;
    }

    for(int i=0;i<n;i++)
        printf("%d ",arr[i]);
}
于 2013-01-27T06:27:32.610 に答える