leetcode----201.数字范围按位与(位运算进阶)

数字范围按位与
Category Difficulty Likes Dislikes
algorithms Medium (43.64%) 67 -
Tags
bit-manipulation
Companies
Unknown
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0

思路:
(1)数据范围太大,枚举的话最后两组数据超时了。
(2)使用位运算,因为使用的是与运算,必须所有的都为1时最后得到的结果的该位才会是1.即判断m - n之间数据的某位是否有0,有则最后结果也会出现0.
(3)对于任意数,二进制表示01101111011,比如要求图中加粗位最后结果是否为1,即判断从m - n之间是否每一个数的该位为0,若有,结果位为0.
(4)比上数大的该位为0的最小数是01101110000+10000
(5)求该数是否大于n,若大,则该位最后结果必为1.

class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
        int res = 0;
        for(int i = 0 ;(1ll << i) <= m; i++)
        {
            if(m >> i & 1)
            {
                if((m & ~((1<<i) -1ll)) +(1 << i) > n)
                    res += 1 << i;
            }
        }
        return res;
    }

/*枚举会超时
    int rangeBitwiseAnd(int m, int n) {
        int res = m;
        for(int i =m+1; i <= n ;i++)
            res &= i;
        return res;
    }
*/
};

你可能感兴趣的:(#,leetcode,算法题解)