Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
Example 1:
Input: [5,7] Output: 4Example 2:
Input: [0,1] Output: 0
题意是给一个范围[m, n],输出这个范围内所有二进制数做AND操作之后的结果。思路是位运算。举个例子,如下是四个连续的数字,
0100010
0100011
0100100
0100101
注意,当他们被AND的时候,会发现最低位会变成0。因为两个相邻的数字的最低位一定不一样,所以AND之后的结果只会是0。这样不停地AND之后(同时向右移,假设最后右移了X次好了),到这一步发现前面若干位都是一样的时候,就可以停止了。最后将m向左移动X次,就会得到最后的结果。
0100xxx
0100xxx
0100xxx
0100xxx
JavaScript实现
1 /** 2 * @param {number} m 3 * @param {number} n 4 * @return {number} 5 */ 6 var rangeBitwiseAnd = function(m, n) { 7 let offset = 0; 8 while (m !== n) { 9 m >>= 1; 10 n >>= 1; 11 offset++; 12 } 13 return m << offset; 14 };
Java实现
1 class Solution { 2 public int rangeBitwiseAnd(int m, int n) { 3 int offset = 0; 4 while (m != n) { 5 m >>= 1; 6 n >>= 1; 7 offset++; 8 } 9 return m << offset; 10 } 11 }