【LeetCode】201. 數字範圍按位與
阿新 • • 發佈:2020-08-23
題目連結
201. 數字範圍按位與
題目描述
給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。
示例 1:
輸入: [5,7]
輸出: 4
示例 2:
輸入: [0,1]
輸出: 0
解題思路
1.暴力法
直接暴力迴圈計算從m到n範圍內資料&計算的結果,資料量大必定超時!不採用
2.觀察法
自己寫的AC程式碼,複雜度有點高就不貼了
3.位運演算法
我們可以把範圍內的每個數字都用二進位制的字串來表示,例如9=00001001,10=00001010,11=00001011,12=00001100然後我們把這4個數字的二進位制字串對齊。
如下圖所示,該問題的求解變成了求範圍內所有資料的二進位制字串的公共字首。再細細的品一下,求範圍內所有資料的二進位制字串的公共字首 等價於求解範圍端點兩個數字的公共字首。
AC程式碼
class Solution { public int rangeBitwiseAnd(int m, int n) { int num = 0; while(m != n){ m >>= 1; n >>= 1; num++; } return m << num; //左移補零 } }