添加0和1是java中的备用数组单元格

时间:2012-04-26 05:04:02

标签: java algorithm data-structures

我有任何值为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添加到新单元格中。

什么是另一个更好的解决方案。

3 个答案:

答案 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]);
}