LeetCode 201
最直接的方法就是iterator每个数字,然后直接求and的结果,这个效率会比较低。
我们考虑,因为是求and,只要有某个数的这个位置是0,那么结果中同位置就会是0。那么我们可以想象,可能存是这种情况: m<2^x<n,如果是这样的,结果就是0,2 ^x 是 10…0, m肯定是01xxxx,而y是1xxxxx,最后的结果就是0
如果只有 是 2^x <m<n, 那么我们就进行计算。
def rangeBitwiseAnd(self, m: int, n: int) -> int:
if m == 0: return 0
power2 = 1
while power2 < n:
power2 = power2 << 1
if power2 >>1 > m: return 0
result = n
for i in range(m, n):
result = result & i
return result
这个方法提交通过,但是发现只有22%的执行速度,查看了一下其他人的答案,进行了一下改进:
def rangeBitwiseAnd(self, m: int, n: int) -> int:
if m == 0: return 0
power2 = 1
while power2 < n:
power2 = power2 << 1
if power2 >>1 > m: return 0
s=1
while(m!=n):
m=m//2
n=n//2
s*=2
return m*s
这样在m和n之间的更加快速的收敛得到结果。