leetcode 201. Bitwise AND of Numbers Range | 201. 数字范围按位与(Java)
题目
https://leetcode.com/problems/bitwise-and-of-numbers-range/
题解
(这题暴力法超时了,最后还是参考了答案的思路)
最直观的解决方案就是:迭代范围内的每个数字,依次执行按位与运算,得到结果,但此方法在 [m,n] 范围较大的测试用例中超时。
正解如下:
class Solution {
public int rangeBitwiseAnd(int left, int right) {
int shift = 0; // 同时右移 shift 位后,两数第一次相等
while (left >> shift != right >> shift) {
if (left >> shift == 0 && right >> shift != 0) return 0; // 如果最高位不能对齐的话,则必无公共前缀
shift++;
}
return left >> shift << shift; // 见图1,目标是将虚线后面的位置0
}
}
图1:
还没有评论,来说两句吧...