201. Bitwise AND of Numbers Range

仅供自己学习

 

思路:

因为是left到right范围内的所有元素的相与和,所以如果这个范围的数的二进制如果每一位都有0,那么最终就是0。如果不为0的话,那说明范围内所有数的某个位都为1。

所以相与是公共前缀,即相同的高位加上后续的全为0,那么和我们只需要一直右移到left和right相等即可,此时就获得了公共前缀。我们在记录右移次数,再返回结果左移那么多次数的数即可。

代码:

 1 class Solution {
 2 public:
 3     int rangeBitwiseAnd(int left, int right) {
 4         int count=0;
 5         while(left!=right){
 6             left>>=1;
 7             right>>=1;
 8             count++;            
 9         }
10         return left<<count;
11     }
12 };

 

另一种方法是 n%(n-1),通过这个方法将剩余位的1去掉,得到 公共前缀。

代码:

 1 class Solution {
 2 public:
 3     int rangeBitwiseAnd(int left, int right) {
 4         int count=0;
 5         while(left<right){
 6             right=right&(right-1);  
 7         }
 8         return right;
 9     }
10 };

 

上一篇:USACO-修理牛棚


下一篇:P1135 奇怪的电梯