题目地址:
https://leetcode.com/problems/bitwise-and-of-numbers-range/
给定 m m m和 n n n,题目保证 0 ≤ m ≤ n ≤ 2 31 − 1 0\le m\le n\le 2^{31}-1 0≤m≤n≤231−1。问 [ m , n ] [m,n] [m,n]区间所有数字按位与之后的结果是什么。
考虑 m m m和 n n n的二进制表示中,从左向右的第一个不同的那一位,例如在左起第 k k k位(那么 m m m的这一位一定是 0 0 0, n n n的这一位一定是 1 1 1,因为 m ≤ n m\le n m≤n),构造一个数 x x x,其前 k − 1 k-1 k−1位与 m m m相等,第 k k k位是 1 1 1,后面全是 0 0 0,则 m ≤ x ≤ n m\le x\le n m≤x≤n。所以 [ m , n ] [m,n] [m,n]区间所有数字按位与之后的结果,第 k k k位及其右都是 0 0 0,最终答案就是 m m m和 n n n相等的那前 k − 1 k-1 k−1位。代码如下:
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int res = 0;
for (int i = 30; i >= 0; i--) {
if ((m >> i & 1) == (n >> i & 1)) {
res += (m >> i & 1) << i;
} else {
break;
}
}
return res;
}
}
时空复杂度 O ( 1 ) O(1) O(1)。
C++:
class Solution {
public:
int rangeBitwiseAnd(int l, int r) {
int res = 0;
for (int i = 30; i >= 0; i--) {
if ((l >> i & 1) != (r >> i & 1)) break;
res |= (l >> i & 1) << i;
}
return res;
}
};
时空复杂度一样。