题目链接:Bitwise AND of Numbers Range
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4.
这道题的要求是计算给定数m到n中所有数的与操作的结果。
直接思路,从m到n逐个进行与操作。可是当n-m非常大的时候,时间复杂度就会非常高。
接下来,仔细看一下与操作,就是当全是1的时候结果才是1。也就是说,对应的2位不同的话,就清零。而[m, n]间的所有数字进行与操作,也就是将这些数字对应的某一位:
- 如果相同,不变;
- 如果有不同,清0。
可以注意到,数字在加1的时候,是从最右边的位开始的,因此可以不用[m, n]间的所有数字,只需要m和n,从左侧开始,保留相同的数位,直到出现第一个不同的,将该位直到最后清0即可。
时间复杂度:O(n)(n为int的二进制位数,即32)
空间复杂度:O(1)
1
2
3
4
5
6
7
8
9
10
11
12
class Solution
{
public:
int rangeBitwiseAnd(int m, int n)
{
// 求最左侧开始m和n中相同的位
int res = INT_MAX;
while((m & res) != (n & res))
res <<= 1;
return m & res;
}
};