LeetCode题号[200,299]刷题总结

目录
  • 201. 数字范围按位与
    • 思路


201. 数字范围按位与

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

思路

  • 找出m,n两个端点的共同公共前缀即可
public int rangeBitwiseAnd(int m, int n) {
    int ans = 0;
    int key = 1<<31;
    while(key != 0){
        if ((m & key) != 0 && (n & key) != 0){
            ans += key;
        } else if ((m & key) != 0 || (n & key) != 0){
            break;
        }
        key >>>= 1;
    }
    return ans;
}
  • 有种相对更简单的方法
  • 每次将n的最右端的1变为0,直到\(n <= m\)为止,此时与运算结果就是共同公共前缀
public int rangeBitwiseAnd(int m, int n) {
    while (m < n){
        n &= n-1;
    }
    return m & n;
}

你可能感兴趣的:(LeetCode题号[200,299]刷题总结)