检查大小为n的数组是否包含0到n-1

时间:2012-12-24 13:31:35

标签: arrays sorting

以下是我需要回答的问题: 我的程序得到一个大小为n的数组,其中包含从0到n-1的数字。您可以假设我们没有得到低于0的数字或高于n-1的数字。

我需要检查数组是否包含0到n-1之间的所有数字,如果包含,则返回1。否则为0。

的示例:

大小为5的数组:4,1,0,3,2返回1。

大小为5的数组:4,1,0,3,1返回0(2不在数组中)

我试图做的事情:

    int Ex4_bonus() //sort a using a single for loop, then iterate through it with another for loop to look 
{              // for a spot that doesnt equal the value inside it.
    int i,n,boolean=1,temp=0;
    int* a;
    printf("Enter the size of the array\n");
    scanf("%d",&n);
    a=input_array_dyn(a,n);
    printf("Enter numbers from 0-%d\n",n-1);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
    {
        if(a[i]!=i)
        {
            temp=a[a[i]];
            a[a[i]]=a[i];
            a[i]=temp;
        }
    }
    for(i=0;i<n;i++)
        if(a[i]!=i)
            boolean=0;
    printf("%d\n",boolean);
    return boolean;
    free(a);
}

但它不适用于某些阵列。我哪里出错了,有更好的方法吗?您不能使用其他数组,程序必须以O(n)运行。

3 个答案:

答案 0 :(得分:1)

计算2**a[i]的总和。如果它不等于(2**n)-1那么你就错过了一个元素。

答案 1 :(得分:0)

public static boolean arrayCheck(int[] ints) {
for (int i = 0; i < ints.length; i++) {
  while (i != ints[i]) {
    int currPosVal = ints[i];
    if (currPosVal <= i || currPosVal >= ints.length) {
      return false;
    }
    int temp = ints[currPosVal];
    if (currPosVal == temp) {
      return false;
    }
    ints[i] = temp;
    ints[currPosVal] = currPosVal;
  }
}
return true;

}

答案 2 :(得分:0)

利用异或运算的特性。

C++:

bool solve(vector<int>& arr){
    int xor = 0;
    for (int i = 1; i < arr.size(); i++)
        xor ^= i;

    for (int  v: arr)
        xor ^= v;

    return xor == 0;
}

或:

bool solve(vector<int>& arr){
    int xor = 0;
    for (int i = 0; i < arr.size(); i++)
        xor ^= i^arr[i];

    return xor == 0;
}