随州网站建设全包,青少年活动中心网站建设依据,关键词的选择网站提示,暴雪国服回归文章目录 题目描述思路分析完整代码 题目描述 给你两个整数 left 和 right #xff0c;表示区间 [left, right] #xff0c;返回此区间内所有数字 按位与 的结果#xff08;包含 left 、right 端点#xff09;。 示例 1#xff1a; 输入#xff1a;left 5, right 7 输出… 文章目录 题目描述思路分析完整代码 题目描述 给你两个整数 left 和 right 表示区间 [left, right] 返回此区间内所有数字 按位与 的结果包含 left 、right 端点。 示例 1 输入left 5, right 7 输出4 示例 2 输入left 0, right 0 输出0 示例 3 输入left 1, right 2147483647 输出0 思路分析
这道题是求left到right之间每一个数与操作的结果。
测试用例还挺良心的给了个1-2147483647。告诉你暴力过不了哈哈。
这里可以回想一下二进制与操作两个数的‘’与‘’只要有0则为0。 而一个数不断加1变成另一个数的过程中实际上每一位都有变成0的情况。 这里举个例子秒懂
比如4-5 对应二进制 101-1109-10 对应二进制 111-1000100-101 对应二进制 1100100 -1100101
所以其实就是找两个数的最长公共前缀。
这样思路就简单了两个数的二进制不断往右移动当两者相等的时候停止移动。 记t为移动的次数t就是两个数的二进制不同的位数。此时再左移t位就可以啦。
完整代码
class Solution:def rangeBitwiseAnd(self, left: int, right: int) - int:res 0while leftright:left left1right right1res 1return leftres