第三题,给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来。
void getNum(int a[],int length)
{
int s = 0;//保存异或结果
for(int i=0;i<length;i++)
{
s=s^a[i];
}
int temp1 = s; //临时保存异或结果
int temp2 = s; //临时保存异或结果
int k=0;
while((temp1&1) == 0) //求异或结果中位为1的位数
{
temp1 = temp1>>1;
k++;
}
for(int i=0;i<length;i++)
{
if((a[i]>>k)&1) //将s与数组中第k位为1的数进行异或,求得其中一个数
{
//cout<<a[i]<<" ";
s=s^a[i];
}
}
cout<<s<<" "<<(s^temp2)<<endl; //(s^temp2)用来求另外一个数
}
本文介绍了一种高效算法,用于在一个包含重复元素的大数组中找出仅出现一次的两个数。通过位运算实现,该算法避免了使用额外的数据结构。


被折叠的 条评论
为什么被折叠?



