Leetcode 201 数字范围按位与
解法1
最通俗的解法,区间的两端,在不相等的情况下,区间之内最后一位与运算之后一定是0,这样的话,每次都让m,n向右移动,知道m和n相等即可
public static int rangeBitwiseAnd(int m, int n) {
int count=0;
//只要m<n表明这个位置就可以置为0,也就是最后一位可以置为0
while(m<n)
{
count++;
m>>>=1;
n>>>=1;
}
return m<<count;
}解法2
通过解法1,我们已经了解了这道题的本质了,就是不断的考虑最后一位,只要当前m<n,我们就可以把n的最后一位置为0。
将当前数字的最后一位置为0,n=n&(n-1)
public static int rangeBitwiseAnd2(int m, int n) {
while(m<n)
{
n=n&(n-1);
}
return n;
}解法3
上述的两种解法都是从右向左考虑的,我们现在可以从左向右考虑,从第一位不相同的位开始考虑
public static int rangeBitwiseAnd3(int m, int n) {
if(m==n){
return m;
}
return m&(~Integer.highestOneBit(m^n)+1);
}Integer.highestOneBit这个方法就是保留最高位的1,其他的位全部置为0,取反加1就是去相反数
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}return之前的操作就是将最高位以及最高位右边的数字全部置为1,然后将当前的数字向右移动,相减就可以得到结果
广发银行公司氛围 23人发布
查看15道真题和解析