leetcode-201:数字范围按位与
链接
数字范围按位与
分析
首先我们先查看数据范围 [0-231-1],数据范围很大,这个时候我们可以初步判定时间复杂度是O(1) or O(logn)级别
logn级别的复杂度一般是二分,嗯…想了一下,没什么好的思路,就从O(1)开始考虑吧.
既然答案是二进制与,那么我们不妨从二进制角度来考虑.
将left和right转化为二进制之后,突然发现了一个显而易见的规律,如果l和r的二进制位不一样,那么结果一定是0,为什么呢?
对于任意一组二进制位不同的left和right,转化为二进制后,取一个最高位为1,其他位为0的位于left和right之间的数,这三个数相与,结果一定是0,0和left和right之间的其他数据取与也一定是0,这样,我们就解决了二进位不同的问题,下来只需要解决二进制位相同的问题了.
顺着刚才的思路考虑,只有变化的二进制位会受到区间的影响,那么答案一定和不再变化区间的二进制位有关,所以我们要保证当前二进制位的值大于l和r差值即可.然后对这部分取与,就是答案.
code
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
// 记录差值
int x = right - left;
// 结果
int res = 0;
// 用字符串记录left和right二进制值
string a, b;
// 计算left二进制值
while (left) {
int x = left % 2;
a += (x + '0');
left /= 2;
}
// 计算right二进制值
while (right) {
int x = right % 2;
b += (x + '0');
right /= 2;
}
// 二进制位不相等直接返回0
if (a.size() != b.size()) return 0;
for (int i = 0; i < a.size(); i ++) {
// 计算答案
if ((1 << i) > x and a[i] == '1' and b[i] == '1') res += 1 << i;
}
return res;
}
};