1題:1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現 一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找 出來;不用輔助儲存空
間,能否設計乙個演算法實現?
顯然已經有人提出了乙個比較精彩的解法,將所有數加起來,減去1+2+...+1000的和。
這個演算法已經足夠完美了,相信出題者的標準答案也就是這個演算法,唯一的問題是,如果數列過大,則可能會導致溢位。
而異或就沒有這個問題,並且效能更好。
將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。
但是這個演算法雖然很簡單,但證明起來並不是一件容易的事情。這與異或運算的幾個特性有關係。
首先是異或運算滿足交換律、結合律。
所以,1^2^...^n^...^n^...^1000,無論這兩個n出現在什麼位置,都可以轉換成為1^2^...^1000^(n^n)的形式。
其次,對於任何數x,都有x^x=0,x^0=x。
所以1^2^...^n^...^n^...^1000 = 1^2^...^1000^(n^n)= 1^2^...^1000^0 = 1^2^...^1000(即序列中除了n的所有數的異或)。
令,1^2^...^1000(序列中不包含n)的結果為t
則1^2^...^1000(序列中包含n)的結果就是t^n。
t^(t^n)=n。
所以,將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。
當然有人會說,1+2+...+1000的結果有高斯定律可以快速計算,但實際上1^2^...^1000的結果也是有規律的,演算法比高斯定律還該簡單的多。
利用異或進行加密,運算
int a 20 int b 30 int a a b int b a b 獲取b的值 int a b a 獲取a的值string encrytion 我是加密之前的資料 char encrytionchars encrytion.tochararray for int i 0 ichar encr...
利用異或運算子進行加密
首先,什麼是是異或運算 參與運算的兩個值,如果相應的bit位 相同,則結果為0,否則為1.比如在計算機的二進位制中,1異或0的結果為1,0異或0的結果為0,1異或1的結果為1,總結來說 真異或假結果為真,假異或假結果為假,真異或真結果為真。運算子 運算通式 結果 表示式一 表示式二 ps 表示式必須...
寒江雪 利用異或性質實現雙向鍊錶
儲存位址的思路 利用異或的性質,a b p b p a a p b 因此只要知道後繼節點的位址,就可以得到前驅節點的位址 只要知道前驅節點的位址,就可以得到後繼節點的位址 include template struct node template class list template list l...