找出三個只出現一次的數字 C語言實現

2021-06-27 20:14:02 字數 815 閱讀 7798

題目:乙個陣列中有三個數字a、b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。

分析:如果我們把陣列中所有數字都異或起來,那最終的結果(記為x)就是a、b、c三個數字的異或結果(x=a^b^c)。其他出現了兩次的數字在異或運算中相互抵消了。

我們可以證明異或的結果x不可能是a、b、c三個互不相同的數字中的任何乙個。

由於x與a、b、c都各不相同,因此x^a、x^b、x^c都不等於0。

我們定義乙個函式f(n),它的結果是保留數字n的二進位制表示中的最後一位1,而把其他所有位都變成0。f(x^a)、f(x^b)、f(x^c)的結果均不等於0。

f(x^a)^f(x^b)^f(x^c)的結果的二進位制中至少有一位是1。假設最後一位是1的位是第m位。那麼x^a、x^b、x^c的結果中,有乙個或者三個數字的第m位是1。

可以證明x^a、x^b、x^c的三個結果第m位不可能都是1。

因此x^a、x^b、x^c三個數字中,只有乙個數字的第m位是1。於是我們找到了能夠區分a、b、c三個數字的標準。這三個數字中,只有乙個數字滿足這個標準,而另外兩個數字不滿足。一旦這個滿足標準數字找出來之後,另外兩個數字也就可以找出來了。

陣列中三個只出現一次的數字

此文 此問題的相關問題 陣列中兩個只出現一次的數字 題目 乙個陣列中有三個數字a b c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。分析 在部落格 中我們討論了如何在乙個陣列中找出兩個只出現一次的數字。在這道題中,如果我們能夠找出乙個只出現一次的數字,剩下兩個只出現一次的數字就很容...

陣列中三個只出現一次的數字

2012 09 30 20 42 46 分類 陣列 標籤 演算法google 微軟面試題 程式設計 舉報 字型大小 訂閱 題目 乙個陣列中有三個數字a b c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。分析 在部落格中我們討論了如何在乙個陣列中找出兩個只出現一次的數字。在這道題中,...

陣列中三個只出現一次的數字

題目 乙個陣列中有三個數字a b c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。分析 在部落格中我們討論了如何在乙個陣列中找出兩個只出現一次的數字。在這道題中,如果我們能夠找出乙個只出現一次的數字,剩下兩個只出現一次的數字就很容易找出來了。如果我們把陣列中所有數字都異或起來,那最終...