zoukankan      html  css  js  c++  java
  • 【LeetCode】201. Bitwise AND of Numbers Range

    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.

    Credits:
    Special thanks to @amrsaqr for adding this problem and creating all test cases.

    从m到n逐个做与操作肯定是不合理的,最多要进行INT_MAX*32次位与操作。

    可以把复杂度降低到32次移位并处理。

    对于每一位来说,只要中间存在一个0,该位就是0,只有全1的时候才是1.

    因此问题变为:对于从右数第i位数字,从m到n之间是否全1?

    满足全1要同时满足两个条件:

    (1)m的相应位置是1 即起始位置必须是1

    (2)m到n之间的间隔不大于m到最后一个连续1的间隔 

    class Solution {
    public:
        int rangeBitwiseAnd(int m, int n) {
            int ret = 0;
            int gap = n - m;
            if(gap == 0)
                return m;
            int bit = 1;
            //note that 0 <= m <= n <= 2147483647
            //the highest bit must be 0, thus skip i == 31
            for(int i = 0; i < 31; i ++)
            {//bit by bit check zero
                int ind = m % (int)pow(2.0, i+1);
                if((ind >= (int)pow(2.0, i)) && (ind+gap <= (int)pow(2.0, i+1)-1))
                //all 1's
                    ret |= bit;
                bit <<= 1;
            }
            return ret;
        }
    };

  • 相关阅读:
    EFCore
    PS-邮件发送异常信息
    python-Django
    Autofac
    swagger
    查看哪个程序占用了端口
    SQL SERVER-系统数据库还原
    破解root密码
    WebApi路由
    async,await.task
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4436043.html
Copyright © 2011-2022 走看看