4

我有任何值为 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 我放了一个计数器来设置奇数索引中的值,反之亦然
  • 最后,当索引越过创建的新数组的长度时,我开始从后面以偶数模式将 0 添加到新单元格中。

还有什么更好的解决方案。

4

3 回答 3

5

为此,您不需要额外的数组。您可以就地完成。只需保留两个指针,一个在每个奇数步后停止,一个在找到1s. 当第二个指针遇到 a 时,1只需将它与第一个指针交换,递增第一个指针。对数组的长度执行此操作。

于 2012-04-26T05:07:49.083 回答
0

让我们一次尝试就地

在数组的开头保留一个指针,在数组的末尾保留一个指针。

我假设零的数量大于一的数量

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 的数量大于 0 的数量的情况

于 2012-04-26T05:30:28.760 回答
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]);
}
于 2013-01-27T06:27:32.610 回答