给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
实例:
输入: [5,7]
输出: 4
观察,我们看到对于连续的数字,从末尾往首位看,一定都是0,1 交替;而对于与运算,一旦出现0,那么最终结果结果一定都为0。
具体操作,我们从末尾向前遍历m,n的位,同时记录右移清除的位数;相等的时候说明找到了相同前缀;返回恢复的值就可以了。
所以此题的意思我们可以转换思想,即求出公共前缀
public int rangeBitwiseAnd(int m, int n) {
// 记录右移的位数
int count = 0;
while(m < n){
m >>= 1;
n >>= 1;
count += 1;
}
return m <<= count;
}
时间复杂度 O(logn),取决于m,n的位长度,因为 n>m;所以最终由 n 的大小确定。
空间复杂度 O(1)