Friday, August 7, 2015

Leetcode 201: bitwise AND of 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.
这个题目考查的是bit的操作,
M1: for every bit , get the & rst, and then | together, 但是大集合超时,
class Solution {
public:
//32 bits , for every bits , &
    int rangeBitwiseAnd(int m, int n) {
        int rst= 0;
        for (int i = 0; i < 32; i++) {
            int j = 0;
            for ( j = m; j <= n; j++) {
                //for every j right shift one bit
                if (((j >> i) & 1) == 0) {
                    break;
                }
            }
            if (j == n+1) { // 1 in this bit
                rst |= (1 << i);
            }
        }
        return rst;
    }
};

M2: 题目中是在一个range里面的数, 所以,对于任意两个n & n+1,其实最低位肯定是不同的,所以最低位肯定是0, 比如: 100 & 101, 110&111, 所以只要看m 和 n高地址位有几位是相同的,其他不同的地方肯定&之后都是0了,那么如何找出m 和 n高地址位相同的部分呢? 我们可以同时移动m,n,每次m,n往右移动一位,看m 和n是否相同,如果相同,说明此时m或者n是两者相同的部分,再把m往左移动之前移动过的位数就可以了。

要注意分析题目的特点,连续的值 &的结果是有特点的。
class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int i = 0;
        while (m != n) {
            m >>=1;
            n >>= 1;
            i++;
        }
        return m<<i;
    }
};

No comments:

Post a Comment