1.方法1:qsot排序方法
排序方式:
1.qsort排序
2.nums[i+1]-nums[i]==1,则这2个数相邻,如果等于2则不相邻,返回i+1则是消失的数字
int com_int(const int* e1, const int* e2)
{
return (*(int*)e1 - *(int*)e2);
}
int missingNumber(int* nums, int size)
{
qsort(nums, size, sizeof(int), com_int);
for (int i = 0; i < size-1; i++)
{
if (nums[i+1] - nums[i] == 1)
{
continue;
}
else
{
return i + 1;
}
}
}
int main()
{
int nums[] = { 0,1,2,3,4,6,7,8,9 };
int sz = sizeof(nums) / sizeof(nums[0]);
int ret = missingNumber(nums, sz);
printf("%d\n", ret);
return 0;
}
2.哈希表思想:
1.先开辟一个和nums数组大小一样的空间,然后全部赋值成-1
2.然后对应下标保存对应数字
3.遍历数组,把数组中为-1的值的对应的下标返回则是消失的数字
int missingNumber(int nums[], int sz)
{
int* tmp = (int*)malloc(sizeof(int) * sz+1);
for (int i = 0; i < sz+1; i++)
{
tmp[i] = -1;
}
for (int i = 0; i < sz; i++)
{
tmp[nums[i]] = nums[i];
}
for (int i = 0; i < sz; i++)
{
if (tmp[i] == -1)
{
return i;
}
}
}
int main()
{
int nums[] = { 0,1,2,3,4,6,7,8,9 };
int sz = sizeof(nums) / sizeof(nums[0]);
int ret = missingNumber(nums, sz);
printf("%d\n", ret);
return 0;
}
3.相邻插值相减:
1.把[0–n]的所有数字相加存到sum中
2.再把nums数字中的所有值相加存放到sunnums中,最后sum-sunnums就是消失的数字
int missingNumber(int* nums, int sz)
{
int sum = 0, sumnums = 0;
//等差数列求和
sum = ((0 + sz) * (sz + 1)) / 2;
for (int i = 0; i < sz; i++)
{
sumnums += nums[i];
}
return sum - sumnums;
}
int main()
{
int nums[] = { 0,1,2,3,4,6,7,8,9 };
int sz = sizeof(nums) / sizeof(nums[0]);
int ret = missingNumber(nums, sz);
printf("%d\n", ret);
return 0;
}
4.按位异或:
1.把[0–n]的数子字全部与0异或的结果存放到x中
2.然后再用x去异或nums数组中的所有值,结果就得到了消失的数字
int missingNumber(int* nums, int sz)
{
int x = 0;
for (int i = 0; i <= sz; i++)
{
x ^= i;;
}
for (int i = 0; i < sz; i++)
{
x ^= nums[i];
}
return x;
}
int main()
{
int nums[] = { 0,1,2,3,4,6,7,8,9 };
int sz = sizeof(nums) / sizeof(nums[0]);
int ret = missingNumber(nums, sz);
printf("%d\n", ret);
return 0;
}
这篇文章就到这里,有问题的伙伴可以留言哦
点个赞再走吧!