一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
分析:
(不使用额外的存储空间)
按照什么规则把5和6分开?
1.整体异或,结果就是两个不一样的数字异或结果x
2.找到x任意第k位为1的位
3.根据这个位 将原数组分成两组
#include <bits/stdc++.h>
using namespace std;
void findSingleNumber(int a[],int len,int* p1,int* p2)
{
int t=0;//异或的初值条件
int i,k;
for(i=0;i<len;i++)
t^=a[i];
for(i=0;i<32;i++)
{
if((t>>i)&1)
{
k=i;
break;
}
}
*p1=*p2=0;
for(i=0;i<len;i++)
{
if((a[i]>>k)&1)
*p1^=a[i];
else
*p2^=a[i];
}
}
int main()
{
int a[]={1,2,3,4,5,1,2,3,4,6};
int len=sizeof(a)/sizeof(a[0]);
int pnum1,pnum2;
findSingleNumber(a,len,&pnum1,&pnum2);
printf("%d %d",pnum1,pnum2);
}