标签:
题目:一个整型数组里除了两个数字外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。#include <iostream>
using namespace std;
int arr[8]={2,4,3,6,3,2,5,5};
//判断二进制位是否是1;
bool IsBit1(int num,unsigned int indexBit)
{
num=num>>indexBit;
return num&1;
}
//找到数组进行异或操作后第一个是1的二进制位。
unsigned int FindFirstBitIs1(int num)
{
int indexBit=0;
while((num & 1)==0 && (indexBit<8*sizeof(int)))
{
num=num>>1;
++indexBit;
}
return indexBit;
}
//找到出现一次的的数子
void FindNumAppearOnce(int *arr,int length,int *num1,int *num2)
{
if(arr==NULL || length<2)
return ;
int resultExclusiveOR=0;
for(int i=0;i<length;++i)
resultExclusiveOR^=arr[i];
unsigned int indexof1=FindFirstBitIs1(resultExclusiveOR);
*num1=*num2=0;
for(int j=0;j<length;++j)
{
if(IsBit1(arr[j],indexof1))
*num1^=arr[j];
else
*num2^=arr[j];
}
}
int main()
{
int num1,num2;
FindNumAppearOnce(arr,8,&num1,&num2);
cout<<"只出现一次的两个数为:"<<num1<<" "<<num2<<endl;
system("pause");
return 0;
}
运行结果:
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51712738