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

    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测试程序源码

  • 相关阅读:
    一些網址
    mousedown、mouseup、click事件之间的关系及执行顺序
    快速的画一个三角形
    在较小的屏幕下展示一个超宽的图片,如何让图片居中显示?
    Python 模块安装的一些问题
    Python Django 的使用
    Python WEB框架的介绍
    Python 几个前端插件的简单使用
    Python JQuery 正则表达式mini版
    HC蓝牙模块
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214749.html
Copyright © 2020-2023  润新知