我有一个包含0s和1s的混合数组。我想重新排列数组的内容,使数组中尽可能多的偶数位置包含0,奇数位置包含1,但要受0s和1s的数目不变的限制。这意味着,如果0s的数目超过1s的数目,或者反之亦然,那么在重新排列的数组的末尾将有一个块,由all-0s或all-1s组成。如何在一次传递中修改数组?
例如:

Input:  {0,1,1,0,1,0,1,0,1,1,1,0,0,1,0,1,1}
Output: {0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1}

最佳答案

您可以使用标准的双色排序算法;只需编辑数组引用,将对数组前半部分的访问映射到实际数组中的偶数元素,并将对数组后半部分的访问映射到实际数组中的奇数元素(向后)。基本上,a[i]变成(假设size是偶数):

a[i < size/2 ? i * 2 : (size - i) * 2 - 1]

09-05 07:10