我有任何值为0,0,0,0,0,0,0,0,1,1,1的数组 现在我的所需输出应该是每个零将在奇数索引中,1将在偶数中,如果在此之后0,则应该在1之后复制,反之亦然。 意味着输出将是0,1,0,1,0,1,0,0,0,0,0 .... 但是上述操作必须在数组
的单次传递中完成什么是另一个更好的解决方案。
答案 0 :(得分:5)
您不需要额外的数组。你可以就地做到这一点。只需保留两个指针,一个在每个奇数步骤后停止,另一个找到1s
。当第二个指针遇到1
时,只需将它与第一个指针交换,递增第一个指针。这样做是为了数组的长度。
答案 1 :(得分:0)
让我们一次尝试就地
将一个指针放在数组的开头,一个指针放在数组的末尾。
我假设零的数量大于1的数量
int begin = 0, end = length - 1;
while (begin < end){
if (A[begin] == 0 && A[end] == 1){
if (begin % 2 != 0){
int tmp = A[end];
A[end] = A[begin];
A[begin] = temp;
end--;
}
begin++;
}
else
break;
}
请记住,上面的解决方案不适用于1的数量大于零的情况
答案 2 :(得分:0)
#include<stdio.h>
main()
{
int arr[]={1,0,0,1,0,1,1,1,0,1};
int n=10;
int odd,one,tmp;
odd=one=0;
while(true)
{
while(odd<n && arr[odd])
odd+=2;
while(one<n && (((one<=odd)&&(one%2==0)) || !arr[one]))
one++;
if(odd<n && one<n)
{
arr[one]=arr[one]^arr[odd];
arr[odd]=arr[one]^arr[odd];
arr[one]=arr[one]^arr[odd];
}
else
break;
}
for(int i=0;i<n;i++)
printf("%d ",arr[i]);
}