各種面試題 找出三個只出現一次的數

2021-06-18 18:42:29 字數 1829 閱讀 5303

題目:乙個陣列中有三個數字a、

b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。

分析:在部落格

中我們討論了如何在乙個陣列中找出兩個只出現一次的數字。在這道題中,如果我們能夠找出乙個只出現一次的數字,剩下兩個只出現一次的數字就很容易找出來了。

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

我們可以證明異或的結果x不可能是a、b、c三個互不相同的數字中的任何乙個。我們用反證法證明。假設x等於a、b、c中的某乙個。比如x等於a,也就是a=a^b^c。因此b^c等於0,即b等於c。這與a、b、c是三個互不相同的三個數相矛盾。

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

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

接著我們考慮f(x^a)^f(x^b)^f(x^c)的結果。由於對於非0的n,f(n)的結果的二進位制表示中只有乙個數字是1,因此f(x^a)^f(x^b)^f(x^c)的結果肯定不為0。這是因為對於任意三個非零的數i、j、k,f(i)^f(j)的結果要麼為0,要麼結果的二進位制結果中有兩個1。不管是那種情況,f(i)^f(j)都不可能等於f(k),因為f(k)不等於0,並且結果的二進位制中只有一位是1。

於是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三個數字的第m位和x的第m位都相反,因此a、b、c三個數字的第m位相同。如果a、b、c三個數字的第m位都是0,x=a^b^c結果的第m位是0。由於x和a兩個數字的第m位都是0,x^a結果的第m位應該是0。同理可以證明x^b、x^c第m位都是0。這與我們的假設矛盾。如果a、b、c三個數字的第m位都是1,x=a^b^c結果的第m位是1。由於x和a兩個數字的第m位都是1,x^a結果的第m位應該是0。同理可以證明x^b、x^c第m位都是0。這還是與我們的假設矛盾。

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

void getthreeunique(vector& numbers, vector& unique)

unique.push_back(first);

// move the first unique number to the end of array

for(iter = numbers.begin(); iter != numbers.end(); ++iter)

}// get the second and third unique numbers

gettwounique(numbers.begin(), numbers.end() - 1, unique);}

int lastbitof1(int number)

void gettwounique(vector::iterator begin, vector::iterator end, vector& unique)

unique.push_back(first);

unique.push_back(second);

}

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

題目 乙個陣列中有三個數字a b c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。分析 如果我們把陣列中所有數字都異或起來,那最終的結果 記為x 就是a b c三個數字的異或結果 x a b c 其他出現了兩次的數字在異或運算中相互抵消了。我們可以證明異或的結果x不可能是a b c三...

找出只出現一次的整數

問題 乙個整數陣列中每個數均出現三次,只有乙個數隻出現一次。找出這個數。解析 如果這裡的數不是出現三次而是出現兩次,我們可以使用異或的方式將所有的數進行異或,最後的結果自然是僅出現一次的數。受此啟發,這裡考慮將整數表達成3 進製,每一位的異或操作 1 xo 0 1 2 xo 0 2 0 xo 0 0...

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

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