找出数组中两个只出现一次的数字
Q:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
A:将数组的每一个元素进行异或,得到的两个不同数字之间的异或,因为这两个数字不同,所以异或值必然不为0,所以我们找出异或值的一个为1的数位,按照该数位是否为0将数组分成两个子数组A和B,可以知道数组A含有的元素中有两个不同数字的一个,其他都是两两相同的数字;数组B含有的元素中有两个不同数字的另外一个,其他也都是两两相同的数字,再分别进行异或,即可求得两个数。
1 #include <iostream> 2 using namespace std; 3 4 void Calc(int* arr,int n) 5 { 6 int result=0; 7 int a=0,b=0,index=0; 8 for(int i=0;i<n;++i) 9 result=result^arr[i]; 10 while(result) 11 { 12 if(result & 0x1==0) 13 { 14 index++; 15 result=result>>1; 16 } 17 else 18 break; 19 } 20 int cmp=1<<index; 21 for(int i=0;i<n;++i) 22 { 23 if(arr[i] & cmp) 24 a=a^arr[i]; 25 else 26 b=b^arr[i]; 27 } 28 cout <<a<<" "<<b<<endl; 29 } 30 31 int main() 32 { 33 int n; 34 cin >>n; 35 int* arr=new int[n]; 36 for(int i=0;i<n;++i) 37 cin >>arr[i]; 38 Calc(arr,n); 39 return 0; 40 }