劍指Offer 陣列中只出現一次的數字

2021-09-26 22:53:07 字數 1129 閱讀 3680

時間限制:1秒 空間限制:32768k 熱度指數:280102

本題知識點: 陣列

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

方法一:將陣列排序,遍歷該陣列查摘只出現一次的數字

**如下:

class solution ,我們先用陣列中的第乙個元素4(二進位制形式:0100)和陣列中的第二個元素5(二進位制形式:0101)進行異或操作,0100和0101異或得到0001,用這個得到的元素與陣列中的三個元素5(二進位制形式:0101)進行異或操作,0001和0101異或得到0100,正好是結果數字4。這是因為陣列中相同的元素異或是為0的,因此就只剩下那個不成對的孤苦伶仃元素。

現在好了,我們已經知道了如何找到乙個陣列中找到乙個只出現一次的數字,那麼我們如何在乙個陣列中找到兩個只出現一次的數字呢?如果,我們可以將原始陣列分成兩個子陣列,使得每個子陣列包含乙個只出現一次的數字,而其他數字都成對出現。這樣,我們就可以用上述方法找到那個孤苦伶仃的元素。

我們還是從頭到尾一次異或陣列中的每乙個數字,那麼最終得到的結果就是兩個只出現一次的陣列的異或結果。因為其他數字都出現了兩次,在異或中全部抵消了。由於兩個數字肯定不一樣,那麼異或的結果肯定不為0,也就是說這個結果陣列的二進位制表示至少有乙個位為1。我們在結果陣列中找到第乙個為1的位的位置,記為第n位。現在我們以第n位是不是1為標準把元陣列中的數字分成兩個子陣列,第乙個子陣列中每個數字的第n位都是1,而第二個子陣列中每個數字的第n位都是0。

舉例:我們依次對陣列中的每個數字做異或執行之後,得到的結果用二進位制表示是0010。異或得到結果中的倒數第二位是1,於是我們根據數字的倒數第二位是不是1分為兩個子陣列。第乙個子陣列中所有數字的倒數第二位都是1,而第二個子陣列中所有數字的倒數第二位都是0。接下來只要分別兩個子陣列求異或,就能找到第乙個子陣列中只出現一次的數字是6,而第二個子陣列中只出現一次的數字是4。

**如下:

class solution

for(int i=0;i>pos)&1)!=1) *num1^=data[i];

else *num2^=data[i];

} }

};

劍指offer 陣列中只出現一次的數字

1 乙個數字出現一次,其他數字出現兩次 兩個相同的數異或為0,所以將陣列裡的所有數依次異或,得到的結果就是只出現一次的數。include using namespace std int main int num 0 for int i 0 i 7 i cout 2 乙個數字出現一次,其他數字出現n次...

劍指offer 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 首先考慮如果陣列中只有乙個數字出現一次,其他的數字都出現兩次,怎麼找出這個只出現一次的數字?這裡需要用到異或運算的性質 乙個數字 不管是什麼形式的數字,只要其二進位制形式確定 和其自身的異或運算的結果一...

《劍指offer》 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 1.了解幾個常識 a.了解兩個相同的數字異或結果為0 b.任何數字與0進行異或結果為數字本身 c.任何數字與1相與,只有最低位 右邊 為1時候,才等於1 2.一種對陣列分成兩組的方法,比如2 10 和3...