您的位置:首页 > 其它

找出数组中两个只出现一次的数字

2015-03-24 16:18 232 查看
原博客地址: 找出数组中两个只出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

还是理解不够深刻。 

这题的主要思路还是之前的数组中只出现一次的数字的那种模式,一次遍历加上异或运算。那么这个异或的值肯定是这两个只出现一次的数字的相异或的值。那么这个值的二进制表现形式中的1的结果就表示这两个数字在该bit位上不一样。那么通过此举,我们可以以这个bit位是否为1来从整个数组中把这两个只出现一次的数字分开。

通过此举,别的出现两次的数字一会被分到同一组,那么结果就是有两组数据,每组都是奇数个数字,都有只出现一次的数字。

#include<stdio.h>
#include<assert.h>
int findOutTwo(int *a,int n,int &x,int &y){
assert(a);
assert(n>2);
int result=a[0];
for(int i=1;i<n;++i)
result^=a[i];
int b=result&-result;
x=0;
y=0;
for(int i=0;i<n;++i)
{
if(b&a[i])
x^=a[i];
else
y^=a[i];
}
return 0;
}
int main()
{
int a[]={1,1,2,2,3,3,4,4,5,6};
int x,y;
findOutTwo(a,sizeof(a)/sizeof(int),x,y);
printf("%d %d\n",x,y);
getchar();
return 0;
}


结果为: 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: