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
.
解题方法
brute force
显然最简单的就是将每个and一次,但是时间复杂度太高
找规律
我们已经知道x & (x-1)
会消去x最右边为1的bit, 那么对于一个数y, y & (y+1)
是同样的效果,y & ( y + 2)
其实就能够bit 2设为0
那么这道题其实并不难,我们先从题目中给的例子来分析,[5, 7]里共有三个数字,分别写出它们的二进制为:
101 110 111
相与后的结果为100,仔细观察我们可以得出,最后的数是该数字范围内所有的数的左边共同的部分,如果上面那个例子不太明显,我们再来看一个范围[26, 30],它们的二进制如下:
11010 11011 11100 11101 11110
发现了规律后,我们只要写代码找到左边公共的部分即可,然后每次向左移一位,比较m和n是否相同,不同再继续左移一位,直至相同, 然后再将m右移回去得到结果
Solution
class Solution(object):
def rangeBitwiseAnd(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
numDiff = 0
while m != n:
m >>= 1
n >>= 1
numDiff += 1
return m << numDiff