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;
        }
        
        
        
        
    };
    
  • 相关阅读:
    原生JS 碰撞检测
    sdw
    无题
    什么是递归?递归大讲义
    C#中常用的经典文件操作方法
    rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
    Linux vim命令
    Linux yum命令详解
    visual studio 2013 快捷键大全
    D_S 线性表的顺序表示和实现
  • 原文地址:https://www.cnblogs.com/dacc123/p/12302399.html
Copyright © 2011-2022 走看看