求数组中两个不同的数

algorithm

题目:在给定int数组中存在着两个不同的数字,而其他数字都存在另一个数与它对应(相同),求出此数组两个不同的数字。
解法:熟悉C++位操作的同学知道一种位操作(异或)能够消除相同的数据,规则是

1^1=0;
1^0=1;
0^1=1;
0^0=1;

显而易见,位上相同异或会置0,位上不相同会置1,所以相同的数字在进行异或时,会变为0,而对于任何数异或0都是它本身。如果将全部的数异或一次,那么剔除的是相同的数,得到的结果也是两个不同数的异或结果。我们知道异或的两个数,只有咋对应位不同的时候才会得到结果1,显然最终的结果不是0,不然整个数组都是两两相对的。
如果我们根据异或结果某位为1的数给整个数组分类,那么就能找到这个不同的数了,原因是这两个不同的数必然有一位是不同的。

int func(int arr[],int a,int b)
{
	int num=0,a=0,temp=1;
	for(int i=0;i<sizeof(arr)/sizeof(int);++i)
	{	
		num^=arr[i];
	}
	while((num^temp)==0)		//找到不同的位
		temp<<1;
	for(int i=0;i<sizeof(arr)/sizeof(int);++i)
	{	
		if(temp&arr[i]>0)  //如果大于1,表示在temp位上这个数字为1,所以我们把数字为1的分为一类
		a^=arr[i];      //与异或结果再一次异或,得到的是在temp位上为0的单独的数
	}
	b=num^a;//得到在temp位上为1的单独的数
}

拿到题目之后,想到的解决方法是异或,但是以后就没有思路了,看了解题思路后自己写出的…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值