有一个奇数和偶数相等的数组。数字不按特定顺序存储。是否有可能在适当的位置(O(1)
额外空间)对数组进行洗牌,以便将偶数引导到偶数索引,将奇数引导到奇数索引?
使用辅助存储实现当然是微不足道的,不使用辅助存储的约束使其变得困难。此外,没有模式,在将数组[a1,a2,a3..an,b1,b2...bn...n1,n2,n3...nn]
混合到[a1,b1,c1..n1,a2,b2,c2...n2,...an,bn...nn]
等问题中,有一个固定的映射,这使得人们可以执行此操作。但是这里没有这样的模式,它可以做到吗?
答案 0 :(得分:2)
编写两个迭代器。一个在偶数位置迭代奇数的所有数组索引。另一个迭代奇数位置的所有偶数。
同时迭代两者,并交换迭代器指向的项,直到数组结束。应该有O(n)表现。
答案 1 :(得分:1)
保留两个索引,一个用于奇数,一个用于平均,并且总是找到第一个奇/偶内容的偶数/奇数索引,然后交换:
int even = 0, odd = 1;
do {
while(even < size && array[even] % 2 == 0) even += 2;
while(odd < size && array[odd] % 2 == 1) odd += 2;
if (even < size && odd < size) {
int temp = array[even];
array[even] = array[odd];
array[odd] = temp;
}
}while(even < size && odd < size);