日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异或的妙用

發(fā)布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异或的妙用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://blog.leezhong.com/tech/2011/06/03/php-xor-find-num.html

給你1-1000個連續(xù)自然數(shù),然后從中隨機(jī)去掉兩個,再打亂順序,要求只遍歷一次,求出被去掉的兩個數(shù)。

這題其實挺為面試者的,因為要求1分鐘內(nèi)說出解法,且不能使用計算機(jī)、紙和筆。如果之前沒有遇到過類似的題目,加上面試時的緊張心情,很難能在那么短的時間里想到解決方案,至少我做不到。

好在我有時間,上網(wǎng)看了一下,比較常見的有兩種方法

求方程組的解

遍歷被打亂的數(shù)組時,計算value的累加值和value平方的累加值。結(jié)合未打亂之前的數(shù)組,這樣就能得出x+y = m與x*x+y*y = n兩個方程,解這組方程即可算出被去掉的兩個數(shù)。這種方法比較容易理解,實現(xiàn)起來也比較簡單

使用異或

這個就麻煩點了。先來說說異或的定義:兩個二進(jìn)制位不同的取1。再來說說異或的兩個特性:順序無關(guān) / 對一個數(shù)異或兩次等于沒有異或。順序無關(guān)就是說異或的元素可以隨意交換順序,而不會影響結(jié)果。異或兩次可以理解為+x和-x。

計算出x^y的值

首先,這兩個數(shù)組(打亂前和打亂后)各自異或,也就是1^2^…^1000,得到兩個異或值。再對這兩個異或值進(jìn)行一次異或,這樣就得到了x^y的指(重復(fù)部分互相抵消了)。

// 其實就是把數(shù)組的所有元素進(jìn)行異或,重復(fù)部分互相抵消 result = 1^2^...^1000^1^2...^1000; result = 1^1^2^2...^x...^y...^1000^1000; result = x^y;

獲取計算出的異或值的1所在的位置,并繼續(xù)異或

因為x和y是兩個不同的整數(shù),所以這兩個數(shù)的異或結(jié)果,轉(zhuǎn)化為二進(jìn)制的話,一定在某位是1,假設(shè)在第3位。也就是說如果把原始數(shù)組按第3位是否為0進(jìn)行劃分,就可以分成兩個數(shù)組,每個數(shù)組各包含一個被抽取的數(shù)。如果打亂后的數(shù)組也按這個規(guī)則劃分為兩個數(shù)組,這樣就得到了4個數(shù)組,其中兩組是第3位為0,另外兩組是第3位為1。把第3位為0的兩個數(shù)組所有元素進(jìn)行異或就能得到被抽取的一個數(shù),同理也就能獲得另外一個被抽取的數(shù),于是問題解決。


總結(jié)

以上是生活随笔為你收集整理的异或的妙用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。