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

2021-09-12 13:14:35 字數 1022 閱讀 9428

題目:53. 陣列中只出現一次的數字

知識點:位異或運算

題目描述:

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

解題思路:

之前做過一道陣列中只有乙個數字出現一次,其餘數字都出現兩次的題,那道題直接利用異或的性質就可以很簡單的解決了。

這道的題的解題關鍵是對於那道題的乙個進一步拓展,如果再對這個陣列進行異或的話最後的結果肯定是不為零的,並且得到的結果應該是那兩個不同的數字相異或的結果,那麼就出現這樣乙個問題,我們怎麼樣才能利用之前那道題的思路去解決這道題呢。最根本的一點就是我們需要把這兩個不同的數字分開,分散到兩個陣列中,這樣的話,我們就可以再次使用直接異或了。

有這樣乙個思路,如果兩個數字不同,那麼他們的異或結果肯定是不為零的,也就是說這個異或結果的二進位制表示中,必定至少有一位為一,這個一應當是不同的兩個數字間對應位中,乙個數字這個位上的數字為一,另乙個數字這個位上為零,這樣其實我們其實就具有了乙個劃分的依據了,只需要求出結果中任意乙個不為零的位,然後根據這個位上的數字是否為零對陣列進行劃分,再分別對兩個陣列進行異或就可以了。

**:

//解法一(自研):

if(data.empty())

return;

int sum = 0, index = 0;

for(int num: data)

sum ^= num;

//查詢不為零的那一位

while(index < 32 && (sum & (1 << index)) == 0)

index++;

for(int num: data)

if((num & (1 << index)) == 0)

*num1 ^= num;

else

*num2 ^= num;

}

劍指offer 54陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 10 4 對於 75的...

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

思路 借用列表中的刪除元素功能。coding utf 8 class solution 返回 a,b 其中ab是出現一次的兩個數字 def self,array write code here list for e in array if e not in list else del list li...

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

1 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這1個只出現一次的數字。要求時間複雜度為o n 控制項複雜度為o 1 2 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為o n 控制項複雜度為o 1 1 當陣列中只存...