Leetcode 第201題:Bitwise AND of Numbers Range--數字範圍按位與(C++、Python)

題目地址:Bitwise AND of Numbers Range


題目簡介:

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

Example 1:
Input: [5,7]
Output: 4

Example 2:
Input: [0,1]
Output: 0

題目解析:

1、找規律的暴力和遞歸

上面第一個例子的區間滿足一個條件,即\left [ 5,7 \right ]\in \left [ 4, 8\right )。這裏的4是5左邊最大的2的冪次,8即4的二倍。

當不滿足這樣一個區域時,例如區間\left [ 3,7 \right ],包含了\left [ 3, 4\right )\left [ 4, 7\right ),當計算3&4時,計算情況如下:

得到的結果與其他數字再進行與運算時,得到的結果永遠爲0。所以只要出現跨區域,便直接返回0。

那麼在同一個區域的數字怎麼計算?假設當前區域爲[5,7],他們一塊與的效果如下:

可以看到他們的最高位已經確定,其結果實質上是4加上後面兩位的與運算,即rangeBitwiseAnd(5,7)= 4  + rangeBitwiseAnd(5-4, 7-4),經過遞歸完成上述任務。

C++版:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        if (m == n)
            return m;
        long long r2 = right2(m);
        long long l2 = r2 / 2;
        if (n >= r2)
            return 0;
        if (m == l2)
            return m;
        return l2 + rangeBitwiseAnd(m - l2, n - l2);
    }
    long long right2(int n){
        long long ans = 1;
        while(ans <= n)
            ans *= 2;
        return ans;
    }
};

Python版:

class Solution:
    def rangeBitwiseAnd(self, m: int, n: int) -> int:
        if m == n:
            return m
        r2 = self.right2(m)
        l2 = r2 // 2
        if n >= r2:
            return 0
        if m == l2:
            return m
        return l2 + self.rangeBitwiseAnd(m - l2, n - l2)
    def right2(self, n):
        ans = 1
        while(ans <= n):
            ans *= 2
        return ans

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章