找出數組中兩個只出現一次的數字


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM