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 }