Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4.
这个题目考查的是bit的操作,
M1: for every bit , get the & rst, and then | together, 但是大集合超时,
class Solution {
public:
//32 bits , for every bits , &
int rangeBitwiseAnd(int m, int n) {
int rst= 0;
for (int i = 0; i < 32; i++) {
int j = 0;
for ( j = m; j <= n; j++) {
//for every j right shift one bit
if (((j >> i) & 1) == 0) {
break;
}
}
if (j == n+1) { // 1 in this bit
rst |= (1 << i);
}
}
return rst;
}
};
M2: 题目中是在一个range里面的数, 所以,对于任意两个n & n+1,其实最低位肯定是不同的,所以最低位肯定是0, 比如: 100 & 101, 110&111, 所以只要看m 和 n高地址位有几位是相同的,其他不同的地方肯定&之后都是0了,那么如何找出m 和 n高地址位相同的部分呢? 我们可以同时移动m,n,每次m,n往右移动一位,看m 和n是否相同,如果相同,说明此时m或者n是两者相同的部分,再把m往左移动之前移动过的位数就可以了。
要注意分析题目的特点,连续的值 &的结果是有特点的。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int i = 0;
while (m != n) {
m >>=1;
n >>= 1;
i++;
}
return m<<i;
}
};
No comments:
Post a Comment