【LeetCode】201. 数字范围按位与

题目链接

201. 数字范围按位与

题目描述

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

示例 1: 
输入: [5,7]
输出: 4

示例 2:
输入: [0,1]
输出: 0

解题思路

1.暴力法

直接暴力循环计算从m到n范围内数据&计算的结果,数据量大必定超时!不采用

2.观察法

自己写的AC代码,复杂度有点高就不贴了

3.位运算法

我们可以把范围内的每个数字都用二进制的字符串来表示,例如9=00001001,10=00001010,11=00001011,12=00001100然后我们把这4个数字的二进制字符串对齐。

如下图所示,该问题的求解变成了求范围内所有数据的二进制字符串的公共前缀。再细细的品一下,求范围内所有数据的二进制字符串的公共前缀 等价于求解范围端点两个数字的公共前缀。

AC代码

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
            int num = 0;
            while(m != n){
                m >>= 1;
                n >>= 1;
                num++;
            }
            return m << num; //左移补零
        }
}
原文地址:https://www.cnblogs.com/XDU-Lakers/p/13549107.html