消失的数字

数组arr包含从0到n的所有整数,但是其中缺少了一个,请编写代码找出缺失的那个整数。要求时间复杂度O(N)

从0到n应该有n+1个数字,缺少一个那么该数组元素个数为n。

思考1:

  假如将该数组元素全部相加所得到的和,与正常不缺少该数字的数组之和相减,那么得到的数字就是缺少的数字。

  假设该数组为arr[7]={0,1,2,3,4,5,7}。

#include <stdio.h>
int main()
{
    int arr[7]={0,1,2,3,4,5,7};
    int i;
    int sz;
    int sum=0;//记录缺失数组元素之和
    int ful=0;//记录完整数组元素之和   
    sz=sizeof(arr)/sizeof(arr[0]);
    for(i=0;i<sz;i++)
    {
        sum+=arr[i];
    }
    for(i=0;i<=sz;i++)//此处元素个数要比sz多一个
    {
        ful+=i;
    }
    printf("缺失的数字为%d ",ful-sum);
    return 0;
}

思考2:

  异或的特性,相同数字异或是0,异或结果不受顺序影响,那么将残缺数组所有元素与完整数组所有元素全部异或,结果很显然会仅剩下残缺数组里缺少的那个元素。

#include <stdio.h>
int main()
{
    int arr[7]={0,1,2,3,4,5,7};
    int i;
    int sz;
    int ret=0;//记录异或结果,因0与任何数异或结果都是任何数,所以初始化为0  
    sz=sizeof(arr)/sizeof(arr[0]);
    for(i=0;i<sz;i++)
    {
        ret^=arr[i];
    }
    for(i=0;i<=sz;i++)//此处元素个数要比sz多一个
    {
        ret^=i;
    }
    printf("缺失的数字为%d ",ret);
    return 0;
}

 

posted @ 2021-05-13 10:28  偶遇的  阅读(129)  评论(0)    收藏  举报