【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; //左移补零
}
}