面試題56 題目一 陣列中只出現一次的兩個數字

2021-08-28 05:46:26 字數 1977 閱讀 6772

/*

* 面試題56-

題目一:陣列中只出現一次的兩個數字

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

* 思路:異或運算,

* 我們想到了異或運算的性質:任何乙個數字異或它自己都等於0。

* 也就是說,如果我們從頭到尾依次異或陣列中的每乙個數字,那麼最終的結果剛好是那個只出現一次的數字,因為那些出現兩次的數字全部在異或中抵消掉了。

* 有了上面簡單問題的解決方案之後,我們回到原始的問題。如果能夠把原陣列分為兩個子陣列。

* 在每個子陣列中,包含乙個只出現一次的數字,而其它數字都出現兩次。

* 如果能夠這樣拆分原陣列,按照前面的辦法就是分別求出這兩個只出現一次的數字了。

我們還是從頭到尾依次異或陣列中的每乙個數字,

* 那麼最終得到的結果就是兩個只出現一次的數字的異或結果。因為其它數字都出現了兩次,在異或中全部抵消掉了。

* 由於這兩個數字肯定不一樣,那麼這個異或結果肯定不為

0,也就是說在這個結果數字的二進位制表示中至少就有一位為1 。

* 我們在結果數字中找到第乙個為

1 的位的位置,記為第

n位。現在我們以第

n位是不是

1 為標準把原陣列中的數字分成兩個子陣列,

* 第乙個子陣列中每個數字的第

n 位都為

1 ,而第二個子陣列的每個數字的第

n 位都為0 。

* 現在我們已經把原陣列分成了兩個子陣列,每個子陣列都包含乙個只出現一次的數字,而其它數字都出現了兩次。因此到此為止,所有的問題我們都已經解決。

* */

publicclass

publicvoidint

array

,intnum1

,intnum2)

intres

= 0;

//從頭到尾依次異或陣列中的每乙個數字,那麼最終的結果剛好是那個只出現一次的數字,因為那些出現兩次的數字全部在異或中抵消掉了

for(intitem

: array)

//我們在結果數字中找到第乙個為

1 的位的位置,記為第n位

intfirstindex

= findfirstindex(

res);

num1

[0] = 0;

num2

[0] = 0;

//現在我們以第

n位是不是

1 為標準把原陣列中的數字分成兩個子陣列

for(intitem

: array

)else}}//

判斷這個數的二進位制形式從左到右

index

位是否為

"1"

privatebooleanisbit1(intitem

,intfirstindex)

returncheck;

} //

二進位制數

從右往左

找到第乙個

"1"

privateintfindfirstindex(intres)

returnindex;

} }

面試題56 陣列中數字出現的次數

題目一 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。異或的基本性質 2個相同的數異或等於0,且異或操作 滿足結合律和交換律。首先 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次。請寫程式找出這個只出現一次的數字。找出陣列中只出現一次的數 num...

面試題56 陣列中數字出現的次數

陣列中只出現一次的兩個數字。乙個整型陣列裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度o n 空間複雜度o 1 例如,輸入陣列,因為只有4和6只出現了一次,其他數字出現了兩次,所以輸出4和6。先考慮這樣乙個問題,如果這個陣列中,只有乙個陣列出現1次,其餘數...

面試題56 陣列中數字出現的次數

面試題56 陣列中數字出現的次數 public class int results int resultnum 0 for int i 0 i length i int indexofdigit1 findindexofdigit1 resultnum for int j 0 j length j ...