1. 程式人生 > 其它 >力扣刷題 201. 數字範圍按位與

力扣刷題 201. 數字範圍按位與

201. 數字範圍按位與

c++,兩種方法

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        //  0和任何東西做與操作都是0,那麼意味著只要某一位上面出現了0,那麼最後也就是0了,所以就轉化為了求公共字首的問題
        
        //  找公共字首,對大數不斷消去最後的1,直到比小數還小就是公共字首(做一點點解釋,大數與小數的第一位不同必然是大數時1,小數是0,才能保證大數要大一點,我們消去大數的這一位1後,大數必然不會比小數大,此時大數後面全是0,前面是公共字首,也就找到了我們想要的東西)
        // while (n>m){
        //     n = n&(n-1);
        // }
        // return n;

        //  找公共字首,不斷右移,然後直到兩數相同
        int num=0;
        while (m!=n){
            m = m>>1;
            n = n>>1;
            num +=1;
        } 
        return n<<num ;
    }
};

python版

class Solution:
    def rangeBitwiseAnd(self, m: int, n: int) -> int:
        # 0和任何東西做與操作都是0,那麼意味著只要某一位上面出現了0,那麼最後也就是0了,所以就轉化為了求公共字首的問題
        # 找公共字首,不斷右移,然後直到兩數相同
        # num=0
        # while m!=n:
        #     m = m>>1
        #     n = n>>1
        #     num +=1
        # return n<<num    
        
        # 找公共字首,對大數不斷消去最後的1,直到比小數還小就是公共字首(做一點點解釋,大數與小數的第一位不同必然是大數時1,小數是0,才能保證大數要大一點,我們消去大數的這一位1後,大數必然不會比小數大,此時大數後面全是0,前面是公共字首,也就找到了我們想要的東西)
        while n>m:
            n &= (n-1)
        return n