Leetcode 201. Bitwise AND of Numbers Range

题目描述:返回一个[m,n]的逻辑与的结果。

题目链接:Leetcode 201. Bitwise AND of Numbers Range

题目思路第一反应就是一个列表,然后reduce,想不到在8255的时候超时了0-2^31。

正确思路:Leetcode 201. Bitwise AND of Numbers Range
这种对位操作,要么左移,要么右移,有么要看最高位,要么要看最低位,如何置出某个数字中特定的位是需要技巧的,看到32位想到mask 11111...

参考代码

class Solution:
    def rangeBitwiseAnd(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        i = 0
        while(m!=n):
            m >>=1
            n >>=1
            i += 1
        m <<= i
        return m

用32位1做掩摸按位与得出结果,然后不断左移掩摸。

class Solution:
    def rangeBitwiseAnd(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        mask = (1 << 31) - 1
        while((m & mask)!=(n & mask)):
            mask <<= 1 #mask 左移来得到最高位
        return mask & m

利用n&n-1的技巧来去掉最低位的1 然后向左区间靠近。

class Solution:
    def rangeBitwiseAnd(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        while m < n: n &= n - 1
        return n
        

参考链接

LeetCode Bitwise AND of Numbers Range 数字范围位相与

Leetcode 201. Bitwise AND of Numbers Range