[算法学习]寻找缺失的数

这篇博客探讨了一种算法问题,即如何在已知1到n的序列中找到缺失的那个数字。作者提供了两种思路,一种是通过求和然后异或的方法,另一种是利用异或的性质找到两个缺失数。文章详细解释了每种方法的原理,并举例说明了如何应用这些方法找到缺失的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

有一组数字,从1到n,中减少了一个数,顺序也被打乱,放在一个n-1的数组里,请找出丢失的数字。

思路1:

  求出1-n的总和,减去数组中n-1个数,则剩下的值就是丢失的数字。这种方法求和的时候,有可能溢出。可以采用1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;

/*
*功能:1-n的和,与数组和的相差就是所缺少的数.这种方式只适合于数比较小,不然和会溢出.
*也有不溢出的方式:1-a[0]+2-a[1]+3-a[2]+....n-1-a[n-2]+n;
*/
int find_missing_num_add(int *arr,int n)
{
	int ret=n*(n+1)/2;
	for(int i=0;i<n-1;i++)
		ret-=arr[i];
	return ret;
}

思路2:

  采用异或。异或的性质:0^1=1,1^1=0,0^0=0。所以可以采用1^2^3....^n^a[0]^a[1]....^a[n-1]。因为相同的数异或结果为0,而0与n异或的结果为n。

/*
*功能:通过异或方式来查找缺失的数.原理:相同的数异或,结果为0;0与n异或的结果为n
*/
int find_missing_num_xor(int *arr,int n)
{
	int ret=0;
	for(int i=0;i<n-1;i++)
	{
		ret^=(i+1)^arr[i];
	}
	ret^=n;
	return ret;
}

题目升级:

  缺失两个数,求出这两个数。参考http://blog.csdn.net/hhygcy/article/details/4581731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值