40 找出陣列中只出現一次的數字

2021-07-04 04:41:33 字數 1531 閱讀 1040

題目描述:

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。編寫程式找出這個兩個只出現一次的數字。要求時間複雜度o(n),空間複雜度o(1).

,輸出

解析:

空間複雜度為o(1)斷絕了用hash-table的思路,時間複雜度o(n)斷絕排序的思路。

如何判斷乙個數字出現2次呢?

異或的性質:

任何數字和 0 異或,都為它本身。

任意數字和自己異或都為0。

由於成對出現的元素異或結果為 0,那麼整個陣列的異或結果為只出現 一次 的元素的異或結果

因為存在2個出現一次的元素,所以最終結果是2者的異或結果,那麼如何分離出這2個元素?

這2個出現一次的元素,不相等,那麼異或的結果不等0,即2進製表示肯定有1位是不為 0的(都為0,說明相等),等價於這2個元素的此位是不相等的,我們根據該位,可以將整個陣列分為2部分,該位為 1 的分為 1部分,為 0 的一部分。

此時,2個只出現一次的元素被分離開,而成對出現的元素每一位都相等,因此它們也是成對的分布在2個部分陣列中。然後我們分別對這2部分計算異或的結果,即可得到 2 個只出現一次的數字。

注意: &, |, ~ 的優先順序小於 ==,>, < ,注意加括號。

#include 

using

namespace

std;

int findbitindexofone(int number)

return index;

}bool isonebit(int number, unsigned

int index)

if (number & 0x01)

return

true;

else

return

false;

} if (nums == null || length < 2)

return

false;

int xorresult = 0;

for (int i = 0; i < length; i++)

xorresult ^= nums[i];

unsigned

int onebitindex = findbitindexofone(xorresult);

result1 = 0, result2 = 0;

for (int i = 0; i < length; i++)

return

true;

}int main() ;

int result1, result2;

cout

<< result1 << " "

<< result2 << endl;

}

找出陣列中只出現一次的數字

乙個整型陣列裡除了乙個數字以外,其他數字都出現了兩次。找出這個只出現一次的數字 異或運算 任何乙個數字異或它本身都等於0,如果從頭到尾異或陣列中的每乙個數字,那些出現兩次的數字全部在異或中會被抵消,最終的結果剛好是這個只出現一次的數字 package jbarray 找出陣列中只出現一次的數字 au...

找出陣列中只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。package factory description 只出現一次的數字 author jaryn date 2019 12 2 16 36 public class onenumer return...

40 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。異或的方法。先考慮乙個簡單一點的問題,陣列裡除了乙個數字以外,其它都出現兩次,找到這個數字。這個題之前遇到過,做法是把陣列裡所有數字異或,最後得到的數字就是只出現一次的那乙個數字。為什麼是這樣呢?因...