201 数字范围按位与
这个题目面腾讯的时候遇到了,做过去的时候刚开始思考,没什么时间了,后面发现竟然是力扣原题,幸好是选做题啧啧啧。
思路一:如下图所示,找到m和n的公共前缀,也就是所有数的公共前缀了,公共前缀后总有0存在,因此与操作之后这些位都为0.
解决:1)m和n右移,直到两个数相等
- 将右移之后的数左移复原,即是与操作之后的结果。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int shift_cnt = 0;
while(m < n){
m = m >> 1;
n = n >> 1;
shift_cnt++;
}
m = m << shift_cnt;
return m;
}
};
思路二: Brian Kernighan算法,n和n-1做与操作之后,n最后一位1将被置为0.因此,不断在n和n-1之间做与操作,直到n和m相等或n小于m,最后n的公共前缀后的1都将被置为0.
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while(m < n){
n = n & (n - 1);
}
return n;
}
};