面試題40 陣列中只出現一次的數字

2021-08-03 02:25:30 字數 976 閱讀 2071

題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是

o(n)

,空間複雜度是

o(1)

。思路整理一下:

首先交待一下異或的基本性質:2個相同的數異或等於0,任何數與0異或都是本身,且異或操作(^)滿足結合律和交換律。

再來考慮一種簡單一點的情況:乙個陣列中只有乙個元素出現唯一的一次,而有其他元素都出現2次。

那麼我們用0依次異或陣列中每乙個元素,得到的就是那個唯一的元素。因為我們可以利用交換律和結合律將相同的元素移動到一起,那麼在利用結合律,相同的元素兩兩先異或,得到0,最後得到很多0和唯一的元素異或,所以最終的答案就是那個唯一的元素。

所以,如果我們能把原來問題中的陣列,分成2個子陣列,使得每個子陣列中都只有乙個唯一的元素以及很多成對的元素,那麼我們就可以求出每個子陣列中唯一的元素,最終就可以得到原陣列中2個出現次數唯一的元素。

方法是這樣的:

1. 首先陣列中所有元素依次異或,因為相同的元素異或得到0,所以最終的答案就等於那2個唯一的元素a^b的值。

2. 因為a,b不同,所以異或得到的答案肯定是不等於0的,那麼我們就找到a^b的二進位制表示中第乙個為1的位,假如是第k位。而a,b兩個數在第k位上是不同的,乙個為0,乙個為1

3. 接下來我們將第k位是1的分成一組,第k位是0的分成一組,如果2個元素相同,那麼他們第k位肯定是一樣的,所以肯定被分到同一組中。而a,b則被分到2組中去了。

然後我們就可以在每個分組中異或每乙個元素,最終就可以得到那2個唯一的元素。

//num1,num2分別為長度為1的陣列。傳出引數

//將num1[0],num2[0]設定為返回結果

public class solution

return index;

} public boolean isbit1(int num,int index)

}

面試題40 陣列中只出現一次的數字

參考 1.2.題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 需要用到的知識 位運算的異或操作 1.按位異或運算定義 1 1 0 1 0 1 0 1 1 0 0 0 2.規律 定理一a b b a 定理二 ...

面試題40 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解題思路 若是陣列中只有乙個數字出現一次,其餘的數字都出現偶數次,那麼直接將陣列中所有的數進行異或運算,得到的最後的結果就是出現一次的數 出現奇數次的數字 但是,題目要求是有兩個數出現一次,那麼上述...

面試題40 陣列中只出現一次的數字

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。這其實是除了有乙個數字外,其它數字都出現兩次的變種。只有乙個數字不同的時候,可以採用異或來做。但此處是兩個不同。書上給出的方法是先異或,得到結果值。然後在結果中,從右往左找到第一位是1的位號。由此考慮將...