【JS每日一算法:剑指Offer系列】🟨195.数字范围按位与(BrianKernighan算法)

76 阅读1分钟

给你两个整数 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 <= 231 - 1

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: BrianKernighan算法  TC:O(logn)  SC:O(1)
 * @param {*} left
 * @param {*} right
 * @return {*}
 */
function BrianKernighan(left, right){
    /**
     * 本方案使用Brian Kernighan 算法,它用于清除二进制串中最右边的 1。
     * BrianKernighan算法的关键在于我们每次对 number 和 number−1 之间
     * 进行按位与运算后,number 中最右边的 1 会被抹去变成 0。
     * 基于上述技巧,我们可以用它来计算两个二进制字符串的公共前缀。
     * 其思想是,对于给定的范围 [m,n](m<n),我们可以对数字 n 迭代地应
     * 用上述技巧,清除最右边的 1,直到它小于或等于 m,此时非公共前缀部
     * 分的 1 均被消去。因此最后我们返回 n 即可。
     */
    while (left < right)right = right & (right - 1);
    return right;
}