3

増加する数の配列 arr[N] があるとします。他の 2 つ (左と右) に分割する必要があります。

L = {0, 2, 4, 6, 8, 10, ...}

R = {1, 3, 5, 7, 9, 11, ...}

次のアルゴリズムはこれを行います。

for ( i = 0; i < (N / 2) ; i++ )
    {
        L[i] = arr[2 * i + 0];
        R[i] = arr[2 * i + 1];
    }

問題は、リバース アルゴリズムをどのように実行するかです。

したがって、出力配列は次のようになります。

arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...}

PS 私はそれについて多くのことを考えてきましたが、結果はありません:(

4

2 に答える 2

10

簡単な解決策は、既存の操作を文字通り逆にすることです。

for (i = 0; i < (N / 2); i++)
{
    arr[2 * i + 0] = L[i];
    arr[2 * i + 1] = R[i];
}
于 2013-05-23T22:49:12.560 に答える
4

元の問題は、元の配列が偶数の要素を持つことが保証されているかどうかを指定していません。

そうでない場合は、解決策も

 for (i = 0; i < (N / 2); i++) {
     arr[2 * i + 0] = L[i];
     arr[2 * i + 1] = R[i]; }

動作することが保証されています。

最も安全な賭けは

LR = {L, R};

for (i=0; i < N; i++) {
    LR[i mod 2][i/2] = arr[i];
}

上に掲載されているとおりです。

于 2013-05-23T23:10:19.190 に答える