《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之每日一题》:99.删除排序链表中的重复元素 II