一問題描述
乙個陣列中,存在兩個只出現一次的數字,其餘的數字均出現兩次。要求在時間複雜度o(n),空間複雜度為o(1)的情況下找出這兩個數字。
二 問題分析
此題實際考察了,對位操作的理解。首先進行簡化,考慮只有乙個陣列中,只存在出現了一次的乙個數字,其餘數字在陣列中出現兩次,試
找出這個數字。
三 解決方案
首先 回憶 異或操作,任意數字與自身相異或,結果都為0.
還有乙個重要的性質,即任何元素與0相異或,結果都為元素自身。
解決方案:
1 從陣列的起始位置開始,對元素執行異或操作,則最後的結果,即為此只出現了一次的元素。
2 題目中,陣列中存在兩個不同的元素,若是能仿造上述的解決方案,將兩個元素分別放置在兩個陣列中,然後分別對每個陣列進行異或操作,
則所求異或結果即為所求。
3 首先對原陣列進行全部元素的異或,得到乙個必然不為0的結果,然後判斷該結果的2進製數字中,為1的最低的一位。
然後根據此位是否為1 ,可以把原陣列分為兩組。則兩個不同的元素,必然分別在這兩個陣列中。
4 然後對兩個陣列,進行異或操作,即可得到所求。
四 **示例
#include
<
iostream
>
using
namespace
std ;
const
intn =10
;intgetsingle(
int*
a) //
獲取全部元素的異或結果
intgettwo(
int*
a ,int
&one ,
int&
two ,
intsum)
//求陣列中兩個不同的元素
//下面將flag與每個元素相求與,根絕結果是否為1,將其化為兩個陣列
//分別計算每個陣列的異或結果,並將結果,儲存分別儲存在one和two中。
one
=two =0
;//0與任何數異或都為其自身,所以初始化的時候,應該初始化為0
for(
inti =0
; i
<
n ;i++)
else
intmain()
;
intsingle
=getsingle(a) ;
intone =0
;inttwo =0
;gettwo(a ,one , two ,single) ;
cout
<<
single
<
<<
one<
<<
two<<
endl ;
system(
"pause
") ;
return
0;
找出奇數個數中唯一出現一次的數
現在有一堆奇數個數字,只有乙個出現了一次,其餘都出現了偶數次,找出這個數。如果採用簡單遍歷的方法統計每乙個出現的次數,然後輸出次數為1的數,這樣有點複雜,時間複雜度為o n2 include using namespace std typedef struct num int main for in...
陣列中唯一出現1次的數 唯一出現2次的數
題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...
演算法題1 陣列中唯一出現1次的數 唯一出現2次的數
題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...