找出1-100中缺失的两个数

题目:有一个数组 int array[100];本来应该存放的数为1~100,但是有两个数据a,b丢失了,值变成了0。问如何找出丢失的那两个数?附带条件不能开辟额外的空间。

解题思路:常见的两种解法有:1.计算a+b和a*b的值,然后在解方程求解(但是这样会使得中间某个变量过大)。2.使用bit位来标记。占用13个字节。第二种方法使用了额外空间,第一种可能会造成整型溢出。这里考虑转化为熟悉的方法。数组array[100],其下标正好为0-99,能不能利用上数组下标求解呢?答案是肯定的。这里将数组下标加一,变为1-100。将题目转化为array[0]...array[99]以及1-100 这总共200个数中,两个只出现一次的数(解法参见http://zhedahht.blog.163.com/blog/static/2541117420071128950682/)。实现代码如下:

/*
	author:<song0071000#126.com>
	time:2014/03/25
	function:find two number in array
*/
void find_lost_two(int array[],int length,int* num1,int* num2)
{
	*num1 = 0;
	*num2 = 0;
	int temp = 0,i;
	/* 计算200个数的异或和 */
	for(i=0;i<100;i++)
	{
		temp ^=(i+1);
		temp ^=array[i];
	}

	int first_not_zero=1;
	/*找出异或和的最低1的位数*/
	while(temp%2 == 0)
	{
		first_not_zero++;
		temp = temp>>1;
	}
	/*按1进行划分*/
	for(i=0;i<100;i++)
	{
		if(((1<<(first_not_zero-1))&(i+1)) == 0)

			*num1 ^=(i+1);
		else
			*num2 ^=(i+1);
		if(((1<<(first_not_zero-1))&array[i]) == 0)
			*num1 ^=array[i];
		else
			*num2 ^=array[i];
	}
}

如有其它更好方法,欢迎讨论!

本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值