Bitwise AND of Numbers Range

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.

分析:第一种都容易想到,将所有数字进行AND操作,肯定超时的啦

Bitwise AND of Numbers Range
1 class Solution {

2 public:

3     int rangeBitwiseAnd(int m, int n) {

4         int result = 1;

5         for(int i = m; i <= n; i++) result = result & i;

6         return result;

7     }

8 };
View Code

由于是连续整数进行AND,那么只要有一个位上的数字为0,那么该位的结果就为0. 

如果n位数>m位数,一定会出现100…0的情况,AND的结果为100…00

如果n位数=m位数,从最高位开始分析,如果n和m该位上的数字相等,考虑下一位,直到某位上n=1,m=0(因为n>m)。到这种情况时,一定又会出现100…0的情况,所以后面的这些数字进行AND操作所得结果为0.

所以,不断将m和n进行右移位操作,并用计数器计数,直到m=n。

运行时间229ms。想想该怎么优化吧。。

 1 class Solution {

 2 public:

 3     int rangeBitwiseAnd(int m, int n) {

 4         int times = 0;

 5         while(m != n){

 6             m = m >> 1;

 7             n = n >> 1;

 8             times++;

 9         }

10         return m<<times;

11     }

12 };

 

你可能感兴趣的:(number)