這篇文章沒有**。介紹的是純理論的思路。
異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示。其運算法則是對運算子兩側數的每個二進位制位,同值取0,異值取1。它與布林運算的差別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。
== 異或的性質:==
了解了上面這些。來看看這個,非常重要。後面的程式都要用到這個結論:
對於隨意的a,有a^b^c^d^a^k = b^c^d^k^(a^a) = b^c^d^k^0 = b^c^d^k,也就是說。假設有多個數異或,當中有反覆的數,則不管這些反覆的數是否相鄰。都能夠依據異或的性質將其這些反覆的數消去。
詳細來說,假設反覆出現了偶數次。則異或後會所有消去。假設反覆出現了奇數次,則異或後會保留乙個。
以下來看兩道題目:
當然。這道題,能夠用最直觀的方法來做。將所有的數加起來,減去1+2+3+…+1000的和,得到的即是反覆的那個數,該方法非常easy理解,並且效率非常高。也不須要輔助空間。唯一的不足時,假設範圍不是1000。而是更大的數字,可能會發生溢位。
我們考慮用異或操作來解決該問題。
如今問題是要求反覆的那個數字,我們姑且假設該數字式n吧,假設我們能想辦法把1-1000中除n以外的數字所有異或兩次。而數字n僅僅異或一次。就能夠把1-1000**n以外的所有數字消去,這樣就僅僅剩下n了。
我們首先把所有的數字異或,記為t,能夠得到例如以下:
t = 1^2^3^4...^n...^n...^1000 = 1^2^3...^1000(結果中不含n)
而後我們再讓t與1-1000之間的所有數字(僅包括乙個n)異或。便可得到該反覆數字n。例如以下所看到的:
t^(a^2^3^4...^n...^1000) = t^(t^n) = 0^n = n
這道題到此為止。
明確了上面題目的推導過程,這個就非常easy了,將陣列中所有的元素所有異或,最後出現兩次的元素會所有被消去,而最後會得到該僅僅出現一次的數字。
該題目相同能夠該為例如以下情景,思路是一樣的:陣列中僅僅有乙個數字出現了奇數次,其它的都出現了偶數次。
異或性質運用
異或 的乙個很重要的性質是 a a 0 a 0 a 下面總結幾道運用到其性質的題目。例1 有兩個整型亂序陣列,其中乙個陣列比另外乙個多乙個數字,其他數字都一樣,讓你求出這兩個陣列相差的那個數字。要求時間複雜度為o n 思路 先分別求兩個陣列的異或,然後再將兩個陣列的異或結果再進行異或,最終結果就是答...
異或運算的性質
異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質 1 交換律a b a b...
異或的性質和運算
異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質1 交換律 2 結合律 3...