题目-中等难度
给你两个整数 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 <= left <= right <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bitwise-and-of-numbers-range
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 位运算
class Solution:
def rangeBitwiseAnd(self, left: int, right: int) -> int:
shift = 0
# 找到公共前缀, 当 left == right 时,表示已经找到两者的公共前缀
while left < right:
# 将 left 和 right 不断右移,比较最高位
left >>= 1
right >>= 1
# 每次右移后, shift 记录右移的位数。
shift += 1
# 将公共前缀左移回去
return left << shift
2. 位运算
left = 5 # 101
right = 7 # 111
第1次: right = 7 & (7-1) = 7 & 6 = 110
第2次: right = 6 & (6-1) = 6 & 5 = 100
结果: 4
class Solution:
def rangeBitwiseAnd(self, left: int, right: int) -> int:
while left < right:
# 去掉right的最低位1, 直到right小于left
right &= (right - 1)
return right
410

被折叠的 条评论
为什么被折叠?



