题目:
有一组数字,从1到n,中减少了一个数,顺序也被打乱,放在一个n-1的数组里,请找出丢失的数字。
思路1:
求出1-n的总和,减去数组中n-1个数,则剩下的值就是丢失的数字。这种方法求和的时候,有可能溢出。可以采用1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;
/*
*功能:1-n的和,与数组和的相差就是所缺少的数.这种方式只适合于数比较小,不然和会溢出.
*也有不溢出的方式:1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;
*/
int find_missing_num_add(int *arr,int n)
{
int ret=n*(n+1)/2;
for(int i=0;i<n-1;i++)
ret-=arr[i];
return ret;
}
思路2:
采用异或。异或的性质:0^1=1,1^1=0,0^0=0。所以可以采用1^2^3....^n^a[0]^a[1]....^a[n-1]。因为相同的数异或结果为0,而0与n异或的结果为n。
/*
*功能:通过异或方式来查找缺失的数.原理:相同的数异或,结果为0;0与n异或的结果为n
*/
int find_missing_num_xor(int *arr,int n)
{
int ret=0;
for(int i=0;i<n-1;i++)
{
ret^=(i+1)^arr[i];
}
ret^=n;
return ret;
}
题目升级:
缺失两个数,求出这两个数。参考http://blog.csdn.net/hhygcy/article/details/4581731

这篇博客探讨了一种算法问题,即如何在已知1到n的序列中找到缺失的那个数字。作者提供了两种思路,一种是通过求和然后异或的方法,另一种是利用异或的性质找到两个缺失数。文章详细解释了每种方法的原理,并举例说明了如何应用这些方法找到缺失的数字。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



