问题:一组数据中有两个数字都只出现了一次。其他所有数字都是成对出现的。 请找出这两个数字。
首先 ,先要了解位运算,重点异或运算。(在之前的博客中介绍过,此处不介绍:>)
讲一下思路:
如果全部异或一遍就可以得到单独出现的两个元素异或的结果,这个结果中,出现1 的位置表示两个元素当前位一定不同(一个必为1,另一个为0).我们可以根据异或结果中出现1的位置,可以分为两个子数组,每个子数组中,只有一个元素只出现一次,其余元素皆成对出现。然后在对每个子数组单独异或,找出单独的数。
代码实现:
#include <stdio.h>
#include<stdlib.h>
void Search(int *arr,int size)
{
int i=0;
int num=0;
int pos=0;
int k1=0;
int k2=0;
for(i=0;i<size;i++)
{
num^=*(arr+i);
}
//此时num中是出现一次的两个数异或的结果
for(i=0;i<32;i++)
{
if(((num>>i)^1)==0)
{
pos=i;
break;
}
}
//此时pos中记录的是异或结果中第一次出现1的位置,根据pos位置上
//数字的不同,可分为两个子数组
for(i=0;i<size;i++)
{
if(((arr[i]>>pos)&1)==0)
k1^=arr[i];
else
k2^=arr[i];
}
printf("这两数是 :%d %d\n",k1,k2);
}
int main()
{
int array[10]={1,2,3,4,5,6,4,3,2,1};
int len=sizeof(array)/sizeof(array[0]);
Search(array,len);
system("pause");
return 0;
}
在VS2008中运行的结果截图:
有什么疑问可留言,若有错误,望指出:>