1.代码展示
//按位异或查找
int missingNumber(int* nums, int numsSize)
{
int m = 0;
for (int i = 0; i < numsSize; i++)
{
m ^= nums[i];
}
for (int j = 0; j < numsSize + 1; j++)
{
m ^= j;
}
return m;
}
//相减查找
int missingNumber(int* nums, int numsSize)
{
int count = 0;
int sum = 0;
int tmp = 0;
for (int i = 0; i < numsSize; i++)
{
tmp += nums[i];
count++;
sum += count;
}
return sum - tmp;
}
2.思路解析
2.1相减查找
思路: 可以用一个 count 充当计数器,依次从0~9,再用 sum 把 count 累加,实现1~9的代数和
在用 tmp 将数组所有元素之和求出,最后 return sum-tmp 即求得消失的7,以此类推。
2.2按位异或查找
思路:首先了解按位异或运算
- 相同为0,相异为1。即,如果两个二进制位中至少有一个是1,则该位的异或结果为1;如果两个二进制位都为0,则该位的异或结果为0。
- 按位异或运算具有以下性质:
- 任何数与0进行异或运算,结果仍然是那个数本身,即a^0=a。
- 任何数与自身进行异或运算,结果是0,即a^a=0。
- 异或运算满足交换律和结合律,即a^b^a=b^a^a=b^(a^a)=b^0=b。
所以我们先将数组所有元素按位异或,然后将 0~numsSize+1与其按位异或,由于相同的就会成为0,而0与任何数按位异或均为0,那么未出现的数字只在出现了一次在0~numsSzie+1依次遍历(第二次遍历)中,由此可以找到消失的数字。