2020年4月23日 星期四

Leetcode題解 Python & C#:四月挑戰 Bitwise AND of Numbers Range

給一個範圍 [m, n] where 0 <= m <= n <= 2147483647,回傳範圍內所有(整數)的 位元且 結果。

說位元計算是我很少碰到的一塊,不熟悉。

設想一個攤開的情形,答案會是最高位起的連續相同部分取 1, 剩下取 0。

1111011
1100000
11xxxxx => x都會出現0

正因為這是二進位,所以 m, n 之間的數字會使得在最高位連續相同的部分之後的各位置都會有 0 的出現。

因此將著重在如何得到目標部分。

如果 m, n 不相同,m, n往右移一位,直到最高位連續相同的部分時,m == n (※這二者不斷位移後的情形)

由於 m, n 都被動過,到這裡要向左移還原剛右移的部分,因此在剛右移的部分加一變數記錄次數。


Python
class Solution:
    def rangeBitwiseAnd(self, m: int, n: int) -> int:
        i = 0
        while m != n:
            m >>= 1
            n >>= 1
            i += 1
        return m << i  
C#
public class Solution {
    public int RangeBitwiseAnd(int m, int n) {
        int times = 0;
        while(m != n)
        {
            m >>= 1;
            n >>= 1;
            times++;            
        }
        return m << times;
    }
}