201. Bitwise AND of Numbers Range(数字范围按位与)
题目大意
Given two integers left
and right
that represent the range [left, right]
, return the bitwise AND of all numbers in this range, inclusive.
中文释义
给定两个整数 left
和 right
,它们表示范围 [left, right]
,返回这个范围内所有数字的按位与的结果。
示例
- 示例 1:
- 输入:
left = 5
,right = 7
- 输出:
4
- 输入:
- 示例 2:
- 输入:
left = 0
,right = 0
- 输出:
0
- 输入:
- 示例 3:
- 输入:
left = 1
,right = 2147483647
- 输出:
0
- 输入:
限制条件
0 <= left <= right <= 2^31 - 1
解题思路
找到 left
和 right
之间所有数字的公共前缀,这是它们的按位与的结果。
步骤说明
- 初始化一个变量
shift
用于记录公共前缀的长度。 - 当
left
小于right
时,不断地将left
和right
向右移位,同时增加shift
的值。 - 当
left
和right
相等时,表示找到了公共前缀。 - 将公共前缀左移
shift
位,得到最终结果。
代码
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int shift = 0;
// 找到公共前缀
while (left < right) {
left >>= 1;
right >>= 1;
++shift;
}
return left << shift;
}
};