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