题目地址:https://leetcode.com/problems/bitwise-and-of-numbers-range/description/数组
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.ide
For example, given the range [5, 7], you should return 4.this
计算区间[m,n]内全部数字的与。code
看题感受须要对全部的[m,n]范围内的数字进行遍历一遍吧。。其实不须要的。ip
咱们知道,数组的数字是连续的,那么m,n范围内的二进制表示的末尾相同位置必定会出现不一样的0,1.咱们只要找出m,n的作左边起的最长相同的二进制头部便可呀。leetcode
如[5, 7]里共有三个数字,分别写出它们的二进制为:get
101 110 111it
相与后的结果为100,仔细观察咱们能够得出,最后的数是该数字范围内全部的数的左边共同的部分(即m,n左边的共同部分),若是上面那个例子不太明显,咱们再来看一个范围[26, 30],它们的二进制以下:io
11010 11011 11100 11101 11110class
也是前两位是11,后面3位在不一样数字中必定会出现0和一、相与即为0了。
个人作法是把m,n同时向右平移,直到二者相等(头部相同了),再把最后的结果向左平移相同的步数。
代码:
class Solution(object): def rangeBitwiseAnd(self, m, n): """ :type m: int :type n: int :rtype: int """ i = 0 while m != n: m >>= 1 n >>= 1 i += 1 return m << i
2018 年 3 月 9 日