異或運用 演算法題 缺失的數

2021-07-30 08:15:15 字數 1229 閱讀 8090

題目:給出乙個包含 0 .. n 中 n 個數的序列,找出0 .. n 中沒有出現在序列中的那個數。

public int findmissing(int nums) 

int result_total = 0;

int result_incomplete = 0;

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

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

return result_incomplete ^ result_total;

}

解釋:

求出完整陣列裡所有數的異或結果

result_total 

與不完整陣列裡所有數的異或結果

result_incomplete 

,再將這兩個異或結果進行異或運算,得出的結果就是缺失的那個數。公式:(0^1^2^...^n)^(

0^1^2^x^...^n )= x 

異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示。運算時對運算子兩側的數轉化為二進位制形式,同值取0,異值取1。

異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法:二進位制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進製。

性質1、交換律

2、結合律(即(a^b)^c == a^(b^c))

3、對於任何數x,都有x^x=0,x^0=x 4、

自反性 a xor b xor b = a xor  0 = a

***********************************==補充******************************==

發現另乙個簡化版本,思路有點小區別,主要依據x^x=0這個性質,x1^x1^

x2^x2

^x3^x3^....^xn^xn

=0,將所有數都雙倍異或,出來的結果就是少的那個數

public int findmissing(int nums) 

int result_incomplete = 0;

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

return nums.length ^ result_incomplete;

}

異或的運用

異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。異或的性質 1 交換律 a b b a 2 結合律 a b c a b c 3 對於任意的a...

異或運算的運用

背景1 最多有1e6 1個數,其中只有乙個數出現了奇數次,請找出這個數 資料大小為 int 範圍 利用原理 兩個相同的數異或值為0 解決方案 將所有數異或一次,最後得到的值就是出現奇數次的那個數 複雜度o n 背景2 最多有1e6個數,其中有兩個數出現了奇數次,請找出這兩個數 資料大小為 int 範...

異或的性質及運用

文章 異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質1 交換律 2 結合...