201. Bitwise AND of Numbers Range

QUESTION:

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.

EXPLANATION:

思路就是每个数都有32位,每一位进行对比,那么如果有一个是0,那么整个就是0了。所以时间复杂度就是32*n

也就是O(n),也算是线性的时间复杂度了。但是提交了之后还是会有时间上限的问题。

然后思路就是如果n的最高位比m的最高位还需要左移1位,那么其实就肯定是0了。这个时候又有问题了。这个时候TLE问题倒是解决了,int越界的问题又出来了。

于是就添加了Integer.max_value的判断。在ac之后,发现了大神的解决方案。

1.大神的思路用了递归的思想,这个就不说了。

2.很关键的一点是:如果越界,那么两个数字一起越界,那么他们也是可以相等的。

SOLUTION:

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        if(Integer.toBinaryString(n).length()>Integer.toBinaryString(m).length()) return 0;
        if(m==n) return n;
        int result = 0;
        for (int j = 0; j < 32; j++) {
            boolean flag = false;
            for (int i = m; i< Integer.MAX_VALUE && i<= n;i++) {//解决int值越界的问题
                if (((i >>> j) & 1) == 0) {
                    flag = true;
                    break;
                }
            }
            if (!flag) result+= 1<<j;
        }
        return result;
    }
}

//大神的解决方案
class Solution {
  public int rangeBitwiseAnd(int m, int n) {
    return (n > m) ? (rangeBitwiseAnd(m >>> 1, n >>> 1) << 1) : m;
  }
}