leetcode 201 数字范围按位与

leetcode 201

  • 题目
  • 题解
  • 代码

题目

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

leetcode 201 数字范围按位与_第1张图片

题解

本题是一个在思维上的方法,不涉及数据结构和具体的算法。
首先如果是暴力解法遍历区间内的所有数字是超过时间限制的。

首先有两个规则:
(1)假设区间中有w个数字,那么n个数字在第k位只要有一个数字不是1那么按位&的结果一定是0
(2)在区间left到right中,因为是连续的整数,所以一定在left和right的后面的n位上均存在0,根据(1)可知后面的n位按位&的结果都是0.
综上我们只需要找到n到底是几,以及left和right的公共前缀就可以了。现在就可以看代码部分了,其中shift表示的就是n。

代码

class Solution {
public:
    int rangeBitwiseAnd(int left, int right) {
        int shift = 0;
        while(left!=right){
            left = left >> 1;
            right = right >> 1;
            shift+= 1;
        }
        return left << shift;
    }
};

你可能感兴趣的:(leetcode,算法,c++)