力扣面试150题--数字范围按位与

Day 93

题目描述

思路

初次思路:由于与运算只要出现0结果就是0了,于是我就想按位判断,从小到大依次判断出现0就将该位结果设置为0(超时了)

java 复制代码
class Solution {
    public int rangeBitwiseAnd(int left, int right) {
        int res=0;
        int tes=1;
        int max=right;
        int sum=0;
        while(max!=0){//确定判断的最高位是多少
            max=max>>1;
            sum++;
        }
        for(int i=sum;i>=0;i--){
            tes=1;
            for(int j=left;j<=right;j++){
                if((j>>i)%2==0){//取位
                    tes=0;
                    break;
                }
            }
            res=(res<<1)+tes;
        }
        return res;
    }
}

进阶思路:我们转变思路,将一个数组按位与求的是什么,求得是公共前缀(二进制的高位),如果不一样就是0,于是有如下做法:

java 复制代码
class Solution {
    public int rangeBitwiseAnd(int left, int right) {
        int shift = 0;
        // 找到left和right的公共前缀
        while (left < right) {
            left >>= 1;
            right >>= 1;
            shift++;
        }
        // 左移shift位,补回0
        return left << shift;
    }
}