Algorithm/src/main/java/bitwise/RangeBitwiseAnd.java

38 lines
1.4 KiB
Java
Raw Normal View History

2025-05-23 09:17:44 +08:00
package bitwise;
/**
* 题目 201. 数字范围按位与 (rangeBitwiseAnd)
* 描述给你两个整数 left right 表示区间 [left, right] 返回此区间内所有数字 按位与 的结果包含 left right 端点
*
* 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题
*
示例 1
输入left = 5, right = 7
输出4
* 链接https://leetcode.cn/problems/bitwise-and-of-numbers-range/
*/
//没看懂题目
public class RangeBitwiseAnd {
/**
* 经典做法右移对齐再左移复原
* shift = 0
* 如果 left < right说明它们在某个更低的位上 0~n-1 是不同的需要把它们统一右移一位并把 shift++
* 重复步骤 2直到 left == right此时这个相等的值就是它们的公共前缀所有后面变动的位都被右移丢弃了
* 最后把 left 左移 shift 还原回原来数值的高位部分即可
* @param left
* @param right
* @return
*/
public int rangeBitwiseAnd(int left, int right) {
int shift = 0;
// 一直右移,直到 left 和 right 对齐到公共前缀
while (left < right) {
left >>= 1;
right >>= 1;
shift++;
}
// 把对齐后的公共前缀左移回去,低位补 0
return left << shift;
}
}