- 数组nums包含从0到n的所有整数,但是其中缺失了一个,请编写代码找出那一个缺失的整数。
解题思路:使用异或操作
异或运算的性质:
0^n=n //0和任何数异或仍然是任何数
0^0=0 //0和0异或任然是0
a^a=0 //任何数和自己本身异或仍然是自己本身
a^b=b^a //异或操作满足交换律
a^b^c=a^(b^c) //异或操作满足结合律
int MissNumber(int *nums,int size)
{
int x=0;
int i=0;
for(i=0;i<size;i++)
{
x^=nums[i];
}
for(i=0;i<size;i++)
{
x^=i;
}
return x;
}
int main()
{
int nums[MAX]={0};
int i=0;
int ch=0;
printf("Please input:\n");
while(1)
{
scanf("%d",&ch);
nums[i++]=ch;
if(i>=MAX)
break;
}
int size=sizeof(nums)/sizeof(nums[0]);
int c=MissNumber(nums,size);
printf("Missnumber is:%d\n",c);
return 0;
}
假设输入:0 1 2 3 4 6 7 8 9 0 (数字可以不按顺序输入,异或满足交换律) 缺失的数字为 5
第一个for循环x=0^1^2^3^4^6^7^8^9^0
第二个for循环x=0^1^2^3^4^6^7^8^9^0^0^1^2^3^4^5^6^7^8^9
其中其他数字出现两次异或为0,剩下0和5异或为5,得出缺失的数字5