中等-201-數字範圍按位與
阿新 • • 發佈:2020-07-15
LeetCode201
視訊解析
給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。
示例 1:
輸入: [5,7]
輸出: 4
示例 2:
輸入: [0,1]
輸出: 0
該題在於找出m和n的公共字首,在按n的位數往後面補齊0.
m到n之間的數都有該字首,則按位與操作使得這些字首保持不變。而字首後一位數m為0,n為1,無論m、n該位後面的數字為多少,
在m到n之間一定存在一個數,其在字首後面的數為1000... 該數與m按位與得到(字首0000...)
尋找公共字首有兩個方法,和(計數二進位制數字中1的個數)該題類似。
- 位移
m和n同時向右位移,直到m、n相等時,餘下的為字首。
public int rangeBitwiseAnd(int m, int n) {
int count = 0;
while(m!=n){
count++;
m >>= 1;
n >>= 1;
}
n <<= count;
return n;
}
- BK演算法
n=n&(n-1)使得n將最右邊的1轉化為0。當n<=m時,n字首後面的數已經全為0.直接返回.
public int rangeBitwiseAnd(int m, int n) {
while(m<n)
n&=(n-1);
return n;
}