力扣刷題 201. 數字範圍按位與
阿新 • • 發佈:2021-06-11
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