力扣面试150题--数字范围按位与
Day 93
题目描述
思路
初次思路:由于与运算只要出现0结果就是0了,于是我就想按位判断,从小到大依次判断出现0就将该位结果设置为0(超时了)
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,于是有如下做法:
class Solution {public int rangeBitwiseAnd(int left, int right) {int shift = 0;// 找到left和right的公共前缀while (left < right) {left >>= 1;right >>= 1;shift++;}// 左移shift位,补回0return left << shift;}
}