力扣刷题 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
posted on 2021-06-11 09:16  雾恋过往  阅读(37)  评论(0编辑  收藏  举报

Live2D