leetcode_201 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.

Example 1:

Input: [5,7]
Output: 4

Example 2:

Input: [0,1]
Output: 0

首先考虑一种特殊情况,有两个数字p, q,他们用二进制分别表示为

xyz0111
xyz1000

也即,从 2 a − 1 2^{a}-1 2a1变为 2 a 2^a 2a,此时末尾几位数字取AND的结果为0000。
我们再拓展到 [ m , n ] [m, n] [m,n]这个区间上。我们不妨假设 m , n m,n m,n最高的 k k k位是一样的,对应上例中的xyz,它们取AND的结果还是xyz。当 m , n m,n m,n从第 k + 1 k+1 k+1位开始不同时,第 k + 1 k+1 k+1位一定是 n n n中取1,而 m m m中取0,因为 n ≥ m n\geq m nm
这意味着什么呢?
我们一点点增加 m m m,一定会出现形如xyz0111的数字,同理我们一点点缩小 n n n,也一定会出现xyz1000,这两个数字均在 [ m , n ] [m,n] [m,n]中。结合我们上边的分析结果,在这种情况下,第 k + 1 k+1 k+1位以后的AND结果应该是全0。
这样一来我们的算法就很明确了,找出 k k k的值,将 m , n m,n m,n的前 k k k位维持不变,而后边的位全置为0,就得到了输出的结果。
Python代码如下:

def rangeBitwiseAnd(self, m, n):
    i = 0
    while m != n:
        m >>= 1
        n >>= 1
        i += 1
    return n << i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值