题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
分析:
1. 如果遍历这个数组,使用哈希数组来保存每个数字出现的次数,则:事件复杂度是O(N),空间复杂度O(N)。
2. 如果一个整型数组里除了一个数字之外,其他的数字都出现了两次。则可以使用异或操作符
,
int find(int array[],int n)
{
int result=0;
for(int i=0;i<n;i++){
result^=array[i];
}
return result;
}
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。
int find_first_bit_is_1(int n)
{
int cnt=0;
while((n&1)==0){
cnt++;
n=n>>1;
}
return cnt;
}
bool is_bit_1(int n,int cnt)
{
n=n>>cnt;
return (n&1);
}
void find2(int array[],int n,int &num1,int &num2)
{
int bit=0;
for(int i=0;i<n;i++){
bit^=array[i];
}
int cnt=find_first_bit_is_1(bit);
num1=num2=0;
for(int i=0;i<n;i++){
if(is_bit_1(array[i],cnt)){
num1^=array[i];
}else{
num2^=array[i];
}
}
}
测试
void test()
{
int arr[8]={2,4,3,6,3,2,5,5};
int a=0;
int b=0;
find2(arr,8,a,b);
cout<<a<<ends<<b<<endl;
}