3

假设您有一个递增数字的数组 arr[N]。你必须把它分成另外两个(左和右):

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 我一直在想很多,但没有rezult :(

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 回答