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的单独的数
}
拿到题目之后,想到的解决方法是异或,但是以后就没有思路了,看了解题思路后自己写出的…