1. 程式人生 > >56 數組中只出現一次的數字

56 數組中只出現一次的數字

所在 while 出現一次 cto 記錄 length pear solution 兩個

題目描述

一個整型數組裏除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。

測試序列

功能測試(數組中有多對重復的數字;沒有重復的數字;)

邊界測試(數組小於2)

解題思路

異或運算

一個數字與其本身異或,結果為0。即:a^a=0

一個數字與0異或,結果為其本身。即a^0=a

當只有一個數出現一次時,我們把數組中所有的數,依次異或運算,最後剩下的就是落單的數,因為成對兒出現的都抵消了。

依照這個思路,我們來看兩個數(我們假設是AB)出現一次的數組。我們首先還是先異或,剩下的數字肯定是A、B異或的結果,這個結果的二進制中的1,表現的是A和B的不同的位

。我們就取第一個1所在的位數(取任意一個1所在位數都可以,因為代表兩個只出現一次的數該位不同,可以區分開兩個數即可),假設是第3位,接著把原數組分成兩組,分組標準是第3位是否為1。如此,相同的數肯定在一個組,因為相同數字所有位都相同,而不同的數,肯定不在一組。然後把這兩個組按照最開始的思路,依次異或,剩余的兩個結果就是這兩個只出現一次的數字。

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int length = data.size();
        if(length<2)
            return;
        int res=0;
        for(int i=0;i<length;i++){
            res = res ^ data[i];
        }
        int k_bit = 1;  //記錄最高位的bit
        res = res>>1;
        while(res){
            res = res>>1;
            k_bit = k_bit<<1;
        }
        
        *num1 = 0;
        *num2 = 0;
        for(int i=0;i<length;i++){
            if((data[i] & k_bit) == k_bit)
                *num1 = *num1 ^ data[i];
            else
                *num2 = *num2 ^ data[i];
        }
        return;

    }
};

  

題目描述

一個數組除了一個數字只出現1次,其他的數字都出現了三次,請找出只出現1次的數字。

測試序列

功能測試(唯一只出現1次的數字分別為0、正數、負數;重復出現3次的數分別是0、正數、負數)

特殊輸入測試(小於四個元素)

解題思路

56 數組中只出現一次的數字