《LeetCode之每日一题》:204.数字范围按位与

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:204.数字范围按位与相关的知识,希望对你有一定的参考价值。

数字范围按位与


题目链接: 数字范围按位与

有关题目

给你两个整数 left 和 right ,表示区间 [left, right] ,
返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。
示例 1:

输入:left = 5, right = 7
输出:4
示例 2:

输入:left = 0, right = 0
输出:0
示例 3:

输入:left = 1, right = 2147483647
输出:0
提示:

0 <= left <= right <= 2^31 - 1

题解

法一:找规律 + 位移
参考官方题解
思路:

//[9, 12]从左往右将其二进制位写出来
//从左往右我们发现第i 位相同,第i + 1位开始不同则,最终答案位去前i位的公共部分
//自i + 1位开始往后全部为零
class Solution {
public:
    int rangeBitwiseAnd(int left, int right) {
        int shift = 0;
        while(left < right)
        {
            left >>= 1;
            right >>= 1;
            shift++;
        }

        return left << shift;
    }
};


法二:Brian Kernighan 算法
参考官方题解

Brian Kernighan 算法:清除二进制串中最右边的 1
left 小于等于 right,我们消除right 最右边所有的 1,直至left >= right
class Solution {
public:
    int rangeBitwiseAnd(int left, int right) {
        while(left < right)
        {
            right = right & (right - 1);
        }

        return right;
    }
};

以上是关于《LeetCode之每日一题》:204.数字范围按位与的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:254.消除游戏

《LeetCode之每日一题》:199.丢失的数字

《LeetCode之每日一题》:99.删除排序链表中的重复元素 II

《LeetCode之每日一题》:218.从英文中重建数字

《LeetCode之每日一题》:84.找到所有数组中消失的数字

《LeetCode之每日一题》:37.黑板异或游戏