【劍指 Offer 題解】56. 數組中只出現一次的數字

題目

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

思考

  • 異或操作,二進制數的每位進行異或,相同爲0,不同爲1.
  • 兩個相同的數進行異或,結果爲0。
  • 如果題目 改爲 “只有一個數只出現過一次,其他的都出現了2次”,全部數字異或運算,最終的結果就是隻出現一次的數字,解題如下
public int findNum(int nums[]) {
	int result = 0;
	for (int num : nums) {
		result = result ^ num;
	}
	return result;
}
  • 本題中有兩隻出現過1次的數字,那麼所有數字異或的結果即爲那兩個單一數字異或的結果。
  • 接下來要做的是,把數組劃分成兩組A、B,兩個出現一次的數字分在不同的組裏,相同的數字分在同一個組了,這樣就把問題轉換成上面的形式了
  • 兩個不同的數異或,不同的位,值爲1,利用這個特點就劃分兩個組了。
  • result = result & -result得到出 result 最右側不爲 0 的位
//num1,num2分別爲長度爲1的數組。傳出參數
//將num1[0],num2[0]設置爲返回結果
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
    int result = 0;
    for (int num : array) {
        result = result ^ num;
    }
    result = result & -result;
    for (int num : array) {
        if ((num & result) == 0) {
            num1[0] = num1[0] ^ num;
        } else {
            num2[0] = num2[0] ^ num;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章