劍指offer 陣列中只出現一次的數字

2021-09-19 11:23:31 字數 1581 閱讀 6537

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

任何乙個數字異或它自己都等於0。

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

那麼回到我們的題目,因為有兩個只出現一次的數字,所以我們可以試著把原陣列分成兩個子陣列,使得每個陣列包含乙個只出現一次的數字,而其他數字都成對出現兩次。如果這樣拆分成兩個陣列,那麼我們就可以按照之前的辦法分別對兩個陣列進行異或運算找出兩個只出現一次的數字。

問題來了,如何進行分組呢?

我們還是從頭到尾依次異或陣列中的每個數字,那麼最終得到的結果就是兩個只出現一次的數字異或的結果。由於這兩個數字不一樣,所以異或的結果至少有一位為1,我們在結果數字中找到第乙個為1的位置,記為index位,現在我們以第index位是不是1為標準把原陣列拆分成兩個子陣列,第乙個子陣列中的陣列第index位都為1,第二個子陣列中的陣列第index位都為0,那麼只出現一次的數字將被分配到兩個子陣列中去,於是每個子陣列中只包含乙個出現一次的數字,而其他數字都出現兩次。這樣我們就可以用之前的方法找到陣列中只出現一次的數字了。

法一:hashmap

public

class

solution

else

} list

list =

newarraylist

<

>()

;for

(map.entry

entry : temp.

entryset()

)}if(list.

size()

==2)}

public

static

void

main

(string[

] args)

;int

num1 =

newint[2

];int[

] num2 =

newint[2

];solution.

(input,num1,num2)

; system.out.

println

(arrays.

tostring

(num1));

system.out.

println

(arrays.

tostring

(num2));

}}

法二:異或法

public

class

solution

int index =0;

while

((num &1)

==0&& index <8)

for(

int i =

0; i < array.length; i++)}

public

boolean

isa1

(int i,

int index)

}

劍指offer 陣列中只出現一次的數字

1 乙個數字出現一次,其他數字出現兩次 兩個相同的數異或為0,所以將陣列裡的所有數依次異或,得到的結果就是只出現一次的數。include using namespace std int main int num 0 for int i 0 i 7 i cout 2 乙個數字出現一次,其他數字出現n次...

劍指offer 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 首先考慮如果陣列中只有乙個數字出現一次,其他的數字都出現兩次,怎麼找出這個只出現一次的數字?這裡需要用到異或運算的性質 乙個數字 不管是什麼形式的數字,只要其二進位制形式確定 和其自身的異或運算的結果一...

《劍指offer》 陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解法 1.了解幾個常識 a.了解兩個相同的數字異或結果為0 b.任何數字與0進行異或結果為數字本身 c.任何數字與1相與,只有最低位 右邊 為1時候,才等於1 2.一種對陣列分成兩組的方法,比如2 10 和3...