題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是
o(n)
,空間複雜度是
o(1)
。分析:把題目換一下,如果出現不同的數字只有乙個,這可以很容易實現,即把所有的數字異或即可得出結果;可是,現在的題目是有兩個不同的數字。全部異或的結果只能是這兩個不同數字的異或。由於兩個數字不同所以他們異或的結果不為0,即意味這兩個不同的數字有其中的某乙個位元位不同。所以可以根據這個位元為的不同將所有的資料分為兩類,則這兩個數字將分別在不同的分類中。此時分別對這兩類按照之前的方法,把他們(同一類的資料)分別異或將得到這兩個不同的數字。
#include usingnamespace
std;
int xor(int a, int n) //
把陣列a的n個資料異或
return
res;
}void finddiff(int a, int n, int *x, int *y)
}*x = 1
; *y = 1
;
for (int p=0; pp)
else
//位元位為1的為一類
}*x ^= 1; //
消除初始值
*y ^= 1;}
intmain()
; //
8 9finddiff(a,
sizeof(a)/sizeof(int), &x, &y);
cout
<"
"return0;
}
找出陣列中兩個只出現一次的數字
題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 解題思路 這個題目的突破口在 題目為什麼要強調有乙個數字出現一次,其他的出現兩次?我們想到了異或運算的性質 任何乙個數字異或它自己都等於 0。也就是說,如...
找出陣列中兩個只出現一次的數字
問題描述 乙個陣列中除了兩個數字之外,其餘數字均出現了兩次 或偶數次 請寫出程式查詢出這兩個只出現一次的數字,要求時間複雜度為o n 空間複雜度為o 1 問題分析 這是一道很新穎的關於位運算的面試題。首先考慮這個問題的乙個簡單版本 乙個陣列中除了乙個數字之外,其餘的數字均出現兩次,請寫程式找出這個出...
找出陣列中兩個只出現一次的數字
問題描述 乙個陣列中除了兩個數字之外,其餘數字均出現了兩次 或偶數次 請寫出程式查詢出這兩個只出現一次的數字,要求時間複雜度為o n 空間複雜度為o 1 問題分析 這是一道很新穎的關於位運算的面試題。首先考慮這個問題的乙個簡單版本 乙個陣列中除了乙個數字之外,其餘的數字均出現兩次,請寫程式找出這個出...