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.

For example, given the range [5, 7], you should return 4.

分析

第一眼看这是一道很简单很直接的题目,但做了这么多Leetcode,也很容易想到这肯定是一道技巧性很强的题目,直接做的结果就是超时或者超内存。

所以我们必须在时间和空间上做出优化,首先观察到的是,如果下界m==0,那么无论经过多少次运算,其结果最终都为0.

但仅有这一点还不够,所以要从别的角度考虑。

所以我们举几个例子观察一下: m==5,n==7时,返回4

101->111
10->11
1->1

m==2,n==4,返回

010->100
1->10

我们看到,如果每次让m,n右移一位,直到m,n相等为止。记录右移次数count,让最后的m左移count位,就是我们需要的结果。

水平有限,不能给出详尽的数学证明,但可以给出正确结论,即:m到n范围内所有数字相与的结果就是m和n在二进制表示下的”公共首部”

代码如下:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int count=0;
        while(m!=n){
            count++;
            m=m>>1;
            n=n>>1;
        }
        return m<<count;
    }
};

北邮教务系统评教脚本

Published on September 17, 2017

72.Edit distance

Published on September 17, 2017