一【题目类别】
- 位运算
二【题目难度】
- 中等
三【题目编号】
- 201.数字范围按位与
四【题目描述】
- 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
五【题目示例】
-
示例 1:
- 输入:left = 5, right = 7
- 输出:4
-
示例 2:
- 输入:left = 0, right = 0
- 输出:0
-
示例 3:
- 输入:left = 1, right = 2147483647
- 输出:0
六【题目提示】
- 0 < = l e f t < = r i g h t < = 2 31 − 1 0 <= left <= right <= 2^{31} - 1 0<=left<=right<=231−1
七【解题思路】
- 暴力解法肯定会超时,所以我们换个思路
- 分析题意后我们发现,传入的左边界和右边界是中的数字是连续的,也就是说,对这些数字进行按位与,得到的结果就是最后一个位置相等的1后面全是0,可以这么理解:进行按位与操作后,只要有0,与的结果就是0,只有全是1的时候,按位与的结果才是1,所以将这些连续数字的二进制对应,进行按位与操作,我们要求的就是共同的前缀,然后后面补0就是我们要的结果
- 所以首先当左边界和右边界不相等的时候对其进行右移的操作,并记录右移的次数,当左边界和右边界相等时结束
- 因为左边要补0,所以再将结果向左移动记录的次数
- 最后返回结果即可
八【时间频度】
- 时间复杂度: O ( l o g n ) O(logn) O(logn), n n n为传入参数的右边界的大小
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
class Solution {
public int rangeBitwiseAnd(int left, int right) {
int count = 0;
while(left != right){
left >>= 1;
right >>= 1;
count++;
}
return left << count;
}
}
- C语言版
int rangeBitwiseAnd(int left, int right)
{
int count = 0;
while(left != right)
{
left >>= 1;
right >>= 1;
count++;
}
return left << count;
}
- Python语言版
class Solution:
def rangeBitwiseAnd(self, left: int, right: int) -> int:
count = 0
while left != right:
left >>= 1
right >>= 1
count += 1
return left << count
- C++语言版
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int count = 0;
while(left != right)
{
left >>= 1;
right >>= 1;
count++;
}
return left << count;
}
};
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版
-
C++语言版