详解消失的数字(C实现)

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;
}

这篇文章就到这里,有问题的伙伴可以留言哦

点个赞再走吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值