題目地址: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、找規律的暴力和遞歸
上面第一個例子的區間滿足一個條件,即。這裏的4是5左邊最大的2的冪次,8即4的二倍。
當不滿足這樣一個區域時,例如區間,包含了和,當計算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