1. 程式人生 > 實用技巧 >【LeetCode】201. 數字範圍按位與

【LeetCode】201. 數字範圍按位與

題目連結

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; //左移補零
        }
}