找出陣列中唯一出現一次的兩個數字

2021-05-27 16:17:19 字數 1455 閱讀 7451

一問題描述

乙個陣列中,存在兩個只出現一次的數字,其餘的數字均出現兩次。要求在時間複雜度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上有詳細...