标签:java解惑 bitwise and numbers range
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4
题意:求[m,n]之间所有数的按位与
初看之下,觉得太简单不过了,直接依次遍历
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int tmp = 0xFFFFFFFF;
for(int i = m;i < n;i++){
tmp &= i;
}
return tmp&n;
}
}结果超时。
然后继续改进,怎么能够改进呢?
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
求这些数的按位与,是否可以看出一些规律呢?
1、有0的话,则结果为0
2、假设m<= 2^k,n>=2^(k+1),结果为0,这个可以迅速判断出来结果
3、如果2^(k-1)<=m,n<=2^k,结果为[m,n]之间的所有数的按位与。
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
if(m == 0){//m为0,结果一定是0
return 0;
}
long tmp = 1;//2^0,注意定义成long型,否则会出现超时,因为0x80000000<0xFFFFFFFFF,但是继续右移会回到0的情况而出现死循环,故定义成long来避免这个情况
while(tmp <= m){
tmp <<= 1;//2^k
}
//m<=2^k && m<2^(k+1)
if(n >= tmp){
return 0;//n>=2^(k+1)
}else{
int result = m & n;
int i = m + 1, j = n - 1;
while(i < n && j > m){//采用折半计算,进一步加快求解速度
if(i == j){
result = result & i;
i++;
j--;
}else{
result = result & i & j;
i++;
j--;
}
}
return result;
}
}
}查看下别人的,取取经:
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int offset = 0;
while (m!=0 && n!=0)
{
if (m == n)
{
return m << offset;
}
m >>= 1;
n >>= 1;
offset++;
}
return 0;
}
}
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int offset = 0;
while (m!=0 && n!=0)
{
if (m == n)
{
return m << offset;
}
m >>= 1;
n >>= 1;
offset++;
}
return 0;
}
}
标签:java解惑 bitwise and numbers range
原文地址:http://blog.csdn.net/havedream_one/article/details/45145831