题目链接
数字范围按位与
题目描述
注意点
- 0 <= left <= right <= 2^31 - 1
- 包含 left 、right 端点
解答思路
- 返回区间内所有数字按位与的结果,所以区间内所有数字在某一位的值相同,则结果该位数字为该值,否则该位数字为0,所以关键是要找到区间内所有数字的最长公共前缀
- 又因为本题所有数字都是[left, right]区间内连续的数字,发现规律可得,可以简化为寻找left和right的最长公共前缀就是数字范围按位与
- 为什么寻找left和right的最长公共前缀就是区间内所有数字的最长公共前缀?区间内的数字位于left和right之间,假设left和right最长公共前缀长度为n,left中n + i位如果为1,一定会有介于left和right间的某个数在n + i位为0(从第0位开始,left + 1会更新第0位从1到0,left + 2会更新第1位从1到0…)
代码
class Solution {public int rangeBitwiseAnd(int left, int right) {int count = 0;while (left != right) {left >>= 1;right >>= 1;count++;}return left << count;}
}
关键点
- 位运算
- 某个范围内所有数字按位与的规律