#include <iostream>
using namespace std;
unsigned int FindFirstBitIs1(int num)//从右到左找出第一个为1的位,返回找到的从右到左的下标
{
int indexBit=0;
while(((num&1)==0)&&(indexBit<8*sizeof(int)))
{
num=num>>1;
++indexBit;
}
return indexBit;
}
bool IsBit1(int num,unsigned int indexBit)//返回对应的下标的位是否为1
{
num=num>>indexBit;
return (num&1);
}
void FindNumsAppearOnce(int *data,int length,int* num1,int* num2)
{
if(data==NULL||length<2)return;//注意任何时候都要注意输入的判断
int resultExclusiveOR=0;
for(int i=0;i<length;++i)
resultExclusiveOR^=data[i];//将所有的数进行异或
unsigned int indexOf1=FindFirstBitIs1(resultExclusiveOR);//找到从右到左第一个为1的位
*num1=*num2=0;//分组
for(int j=0;j<length;++j)
{
if(IsBit1(data[j],indexOf1))
*num1^=data[j];
else
*num2^=data[j];
}
}
int main()
{
int a[8]={2,1,3,6,3,2,5,5};
int n1=0,n2=0;
FindNumsAppearOnce(a,8,&n1,&n2);
cout<<"两个数字为"<<n1<<" "<<n2<<endl;
return 0;
}
面试题40:数组中只出现一次的数字
最新推荐文章于 2022-03-13 14:30:09 发布