1.题目链接
[面试题 17.04. 消失的数字](https://leetcode.cn/problems/missing-number-lcci/description/)
2.方法
法1
首先先用排序将数组里的元素排成一个升序(或者降序),(这里讲的是升序)然后在用i去遍历整个数组,判i是否等于nums[i] , 若相等则就返回i, i即是数组中丢失的数字;
int cmp(void* e1, void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int findmiss(int* nums, int numssize)
{
qsort(nums, numssize, sizeof(int), cmp);
for (int i = 0; i < n; i++)
{
if (i == nums[i])
{
return i;
}
i++;
}
}
知识回顾;C语言中的抑或(^)操作符的规律:
1.a^0=a;
2.a^a=0
下面我们将用异或操作符来解决这个问题
法2
先让tmp与0到numssize的数进行抑或,然后在让tmp与数组nums中的数字抑或,则最终消失的数字就是a
举个例子:找到b中消失的数字
int a[5]={0, 1 , 5 ,8 ,9}
int b[4]={0,1,5,9}
现在我们令C=0;
C先与a中的数据抑或,在与b中数字进行
即C^0^1^5^8^9^0^1^5^9
由知识回顾中可知道5^5=0;0^8=8
即这里消失的数字是8
同理可得法2成立
int findmiss(int* nums, int numssize)
{
int tmp = 0;
for (int i = 0; i <= numssize; i++)
{
tmp ^= i;
}for (int j = 0; j < numssize; j++)
{
tmp ^= nums[j];
}
return tmp;
}
仅供参考