小小程序媛  
得之坦然,失之淡然,顺其自然,争其必然

题目

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.

分析

题目字面意思是给定两个整数构成闭区间, 0 <= m <= n <= 2147483647 均为合法整数,求区间内所有整数的位与结果。

看起来是一个很简单的题目,我们可以直接一次遍历得到结果,复杂度为O(n),意料之中的超时。。。

那么,换一种方法,可不可以采用递归呢? 两段分别求出结果,然后相与得到最终结果,遗憾的是再次TLE。。。

看来,不能简单的想当然解题,不妨写出每个整数的二进制表示分析一下:

5 0101
6 0110
7 0111
&
0100

有什么规律呢,我们可以看出结果中的“1”是所有数字的所共有的位;这样就有高效的解法了,我们可以利用移位的规则,将数字相异的位右移掉,记录需要移位的个数。

详细代码见下节。

AC代码

class Solution {
public:
    //方法一,一次遍历 TLE
    int rangeBitwiseAnd1(int m, int n) {

        int ret = m;
        for (int i = m+1; i <= n; ++i)
        {
            ret = ret & i;
        }//for
        return ret;
    }

    //方法二,采用递归,TLE again!
    int rangeBitwiseAnd2(int m, int n) {
        if (m == n)
            return m;

        int mid = (m + n) / 2;
        return rangeBitwiseAnd(m, mid) & rangeBitwiseAnd(mid + 1, n);
    }

    //方法三:
    int rangeBitwiseAnd(int m, int n) {
        int offset = 0;
        while (m && n)
        {
            //找到最高相同位
            if (m == n)
            {
                return m << offset;
            }
            m >>= 1;
            n >>= 1;
            offset++;
        }
        return 0;
    }
};

GitHub测试程序源码

posted on 2015-11-20 13:50  Coding菌  阅读(208)  评论(0编辑  收藏  举报