/** 面試題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 ...