1. 程式人生 > >九章演算法面試題1 落單的數

九章演算法面試題1 落單的數

九章演算法官網-原文網址:

題目

初階:有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間複雜度,O(1)的空間複雜度。

進階:如果有2n+2個數,其中有2個數落單,該怎麼辦?

線上測試本題

解答

初階:將2n+1個數異或起來,相同的數會抵消,異或的答案就是要找的數。

進階:假設兩個不同的數是a和b,並且a!=b,將2n+2個數異或起來就會得到c=a xor b,並且c不等於0。因此在c的二進位制位中找到一個為1的位,可推斷在這位上a和b分別為0和1,因此將2n+2個數分為該位位0的組和該位為1的組,兩組中各自會包含2n’+1個數和2n’’+1個數,用初階的演算法即可解決。

面試官角度

該問題的考點,在於異或符號的運用。異或運算是計算機系的基礎知識。上過課的同學一般來會答得上第一問。

第二問會不會被問到看面試官心情。一般來說,對於一個問題的擴充套件問題,解題的思路是如何將它通過一定的變換轉換為初級問題。因此就要去想怎麼分為兩組,兩組各包含2x+1個數就問題得解。會初階問題以後,基本上會想到把所有數異或起來,得到a xor b。再根據題目中的題目a與b不同,意味著該值不為0,從而想到根據該值的二進位制位為1的位來將2n+2個數分為兩組。