40 陣列中只出現一次的數字

2021-08-02 05:48:41 字數 1083 閱讀 6688

題目描述:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

異或的方法。

先考慮乙個簡單一點的問題,陣列裡除了乙個數字以外,其它都出現兩次,找到這個數字。

這個題之前遇到過,做法是把陣列裡所有數字異或,最後得到的數字就是只出現一次的那乙個數字。為什麼是這樣呢?因為異或運算有乙個性質:任何乙個數字異或它自己都等於0.所以將陣列裡的數字從頭到尾異或,最後得到的一定是落單的那乙個數字。

那麼兩個出現一次的問題怎麼解決呢?如果可以把乙個陣列分成兩半,每一半裡都只有乙個只出現一次的數,那就又變成了上面的問題。所以問題變成了我們怎麼樣可以把陣列分成符合條件的兩半?

由於相同的數異或得零,如果把陣列裡所有數異或,得到的將是這兩個落單的數的異或值。由於這兩個數肯定不相等,所以這兩個數的異或值也不會為0。從右向左找到這個異或值不為零的一位,比如說是第n位,那麼根據第n位是否為0把原陣列分為兩個部分。(異或的概念:兩個數對應為相同為0,不同為1),也就是說,如果第n位異或結果為1,這兩個數字的第n位一定不同。所以按照這個標準將陣列分成兩部分,將實現每一部分裡只有乙個落單的數。

**:

class solution 

unsigned

int indexof1 = findfirstbitis1(resor);

*num1 = *num2 = 0;

for(int i = 0;i < data.size();i++)

}//找到num的二進位制表示中找到最右邊是1的位

unsigned

int findfirstbitis1(int num)

return indexbit;

}//判斷在num的二進位制表示中從右邊數起的第indexbit位是不是1

bool isbit1(int num,unsigned

int indexbit)

};

tips:取某數字的二進位制數字的某一位的方法

int num;

num >> n;

num & 1;//得到的就是num從右邊數第n位的值。

40 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。思路 1.利用map,map儲存的是key value對,在這裡key是陣列中的數字,value是陣列中數字出現的次數。遍歷陣列,將數字存入map,那麼map中value為1的兩個數字就是陣列中的...

40 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。class solution 可以用位運算實現,如果將所有所有數字相異或,則最後的結果肯定是那兩個只出現一次的數字異或的結果,所以根據異或的結果1所在的最低位,把數字分成兩半,每一半裡都還有只出現一...

40 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。classname solution description todo date 2019 12 22 12 41 author sonnsei public class solution else if m...