1. 程式人生 > >一個整數型數組裡除了倆個數字之外,其他的數字都出現倆次,求找出這倆個只出現一次的數字

一個整數型數組裡除了倆個數字之外,其他的數字都出現倆次,求找出這倆個只出現一次的數字

思路:

1 倆個相同的數字異或等於0。假設陣列中只有一個只出現一次的數字,因此從頭到尾依次異或陣列中的每個數字,那麼最終的結果就是那個只出現一次的數字。

2 想辦法把陣列分成倆個子陣列,使2個只出現一次的數字分別在兩個子陣列中。

3 分陣列,用依次異或陣列中的每個數,最後的結果不為0,找出最後結果中低位最先出現1 的位置,按照數中這個位置是否為1 將陣列分為倆個字陣列,則數字相同的都成對出現在子陣列中,倆個只出現一次的數字也分別出現在子陣列中。

4 因此整個過程分三步,首先依次異或陣列中的每個數找出結果中低位不為1 的位置,然後陣列分組,最後再分別依次對子陣列進行異或得到結果。

   void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int resultExclusiveOr=0;
        for(int i=0;i<data.size();i++){
            resultExclusiveOr ^= data[i];
        }
        int index=FirstIndexOf1(resultExclusiveOr);
        *num1=0;
        *num2=0;
        for(int i=0;i<data.size();i++){
            if(IsIndexBitOf1(data[i],index)){
                *num1 ^=data[i];
            }else{
                *num2 ^= data[i];
            }
        }
    }
    int FirstIndexOf1(int result){
        int index=0;
        while(((result&1)==0) && (index<8*sizeof(int))){
            result=result >> 1;
            index++;
        }
        return index;
    }
    bool IsIndexBitOf1(int number,int index){
        number=number>>index;
        return (number & 1);
    }