題目描述:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
異或的方法。
先考慮乙個簡單一點的問題,陣列裡除了乙個數字以外,其它都出現兩次,找到這個數字。
這個題之前遇到過,做法是把陣列裡所有數字異或,最後得到的數字就是只出現一次的那乙個數字。為什麼是這樣呢?因為異或運算有乙個性質:任何乙個數字異或它自己都等於0.所以將陣列裡的數字從頭到尾異或,最後得到的一定是落單的那乙個數字。
那麼兩個出現一次的問題怎麼解決呢?如果可以把乙個陣列分成兩半,每一半裡都只有乙個只出現一次的數,那就又變成了上面的問題。所以問題變成了我們怎麼樣可以把陣列分成符合條件的兩半?
由於相同的數異或得零,如果把陣列裡所有數異或,得到的將是這兩個落單的數的異或值。由於這兩個數肯定不相等,所以這兩個數的異或值也不會為0。從右向左找到這個異或值不為零的一位,比如說是第n位,那麼根據第n位是否為0把原陣列分為兩個部分。(異或的概念:兩個數對應為相同為0,不同為1),也就是說,如果第n位異或結果為1,這兩個數字的第n位一定不同。所以按照這個標準將陣列分成兩部分,將實現每一部分裡只有乙個落單的數。
**:
tips:取某數字的二進位制數字的某一位的方法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)
};
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...