zoukankan      html  css  js  c++  java
  • LeetCode 201. Bitwise AND of Numbers Range(位运算)

    题目

    题意:给你两个数n,m 0<= n<=m <=2^31-1 ,让你计算从n到m的每个数依次位与的结果。

    题解:当然不能for循环,按位运算。会超时。

    经过分析我们发现当一个数字为2的整次幂,比如8 :1000,8往后位与的结果都是8,直到位与到16 :10000,8&9&10....15 的结果是1000,再位于16的结果就是0,

    也就是说如果n ~ m 如果有某个数字k ,n < k <=m ,并且k = 2^x,那么位与结果就是0,

    那么如果 k <= n < m 呢?k = 2^x,其实n到m的二进制,都是在k的二进制的基础上,假设k=100...000,那么n到m 都是 100...xxxx,按照递归的思想,这个时候从n到m 减去 k,之后,又会回到第一种情况。存在某种k1 k1=2^x 使得n < k1 <=m结果为0, 或者k1 <= n < m 要减k1继续重复,直到为0.

    最后把减去的k,k1,k2 加起来,就是结果。

    class Solution {
    public:
        int a[32];
        int rangeBitwiseAnd(int m, int n) {
            
            a[0]=1;
            
            for(int i=1;i<=30;i++)
            {
                a[i]=a[i-1]*2;
            }
            
            int ans=0;
            while(1)
            {
                int x = fun(m,n);
                if(x==0)
                    break;
                ans+=x;
                
                m -=x;
                n -=x;
            }
            
            return ans;
            
        }
         
        int fun(int x,int y)
        {
            for(int i=30;i>=0;i--)
            {
                if(x<a[i]&&y>=a[i])
                {
                    return 0;
                }
                if(x>=a[i]&&y>=a[i])
                {
                    return a[i];
                }
            }
            
            return 0;
        }
        
        
        
        
    };
    
  • 相关阅读:
    apache性能测试工具
    redis和memcacahe、mongoDB的区别
    redis 安装
    redis介绍
    svn基本命令
    变量
    redis持久化有几种.如何配置
    Sundy_Android开发深入浅出和高级开发视频教程
    VC++ MFC类库基础(55讲全)
    从C++起步到MFC实战VC++软件工程师高端培训 视频保存在 播音员的网盘中
  • 原文地址:https://www.cnblogs.com/dacc123/p/12302399.html
Copyright © 2011-2022 走看看