與、或、非、異或這些運算子的含義就不過多介紹了,本篇文章主要通過乙個例題來介紹如何靈活使用位運算子,來給我們的演算法錦上添花。例題如下:
演算法**如下
class
solution
return ones;
}}
解題思路如下圖所示、考慮數字的二進位制形式,對於出現三次的數字,各二進位制位出現的次數都是3的倍數。因此統計所有數字的各二進位制位中1的出現次數,並對3求餘,結果則為只出現一次的數字。
各二進位制位的位運算規則相同,因此只需要考慮一位即可。如下圖所示,對於所有數字中的某二進位制位1的個數,存在3種狀態,即對3餘數為0,1,2。
如下圖所示,由於二進位制只能表示0,1,因此需要使用兩個二進位制位來表示3個狀態。設此兩位分別為two,one,則狀態轉換變為:
接下來,需要通過狀態轉換表匯出狀態轉換的計算公式。首先回憶一下位運算特點,對於任意二進位制位x,有:
異或運算:x^
0=x,x^1=
~x與運算:x&0=
0,x&
1=x
計算one方法:設當前狀態為two one,此時輸入二進位制位n。如下圖所示,通過對狀態表的情況拆分,可推出one的計算方法為:
if
(two==0)
引入異或運算,可將以上拆分化簡為:
if
(two==0)
one=one^n;
if(two==1)
one=
0;
引入與運算,可繼續簡化為:
計算two方法:由於是先計算one,因此應在新one的基礎上計算two。如下圖所示,修改為新one後,得到了新的狀態圖。觀察發現,可以使用同樣的方法計算two,即:
返回值:以上是對數字的二進位制中「一位」的分析,而int型別的其他31位具有相同的運算規則,因此可將以上公式直接套用在32位數上。遍歷完所有數字後,各二進位制位都處於狀態00和狀態01(取決於「只出現一次的數字」的各二進位制位是1還是0),而此兩狀態是由one來記錄的(此兩狀態下twos恒為0),因此返回ones即可
複雜度分析:
CSS中你不太了解的細節 (三)
relative 元素開啟相對定位 如果不設定偏移量元素不會發生任何的變化,當元素開啟了定位以後,可以通過偏移量來設定元素的位置。top,bottom,left,right 設定後它的位置只會影響自己,不會影響別人,不存在把別的塊元素擠下去。相對定位是參照於元素在文件流中的位置進行定位的。相對定位會...
不為你所了解的諾基亞
公司型別public omx nok1v nyse nok stockholmsborsen noki frankfurter wertpapierborse noa3 成立時間芬蘭諾基亞 1865年 總部地點芬蘭埃斯波 重要人物fredrik idestam,founder jorma ollil...
你所了解的設計模式
定義 示例 singletonpattern 單例模式的特點 1 私有的構造方法 2 私有的靜態的變數 3 自定義的例項化的方法 public class singleton 要素2 靜態私有成員變數 private static singleton objinstance 要素3 public s...