1. 程式人生 > 實用技巧 >leetcode刷題筆記 二百零一題 數字範圍按位與

leetcode刷題筆記 二百零一題 數字範圍按位與

leetcode刷題筆記 二百零一題 數字範圍按位與

源地址:201. 數字範圍按位與

問題描述:

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

示例 1:

輸入: [5,7]
輸出: 4
示例 2:

輸入: [0,1]
輸出: 0

//因為是對區間內所有數字進行與操作, 一旦出現對應位置不相同,在區間內所有數求與的過程中肯定為0
//按照這個思路,就將問題轉化為最長公共二進位制字首
object Solution {
    def rangeBitwiseAnd(m: Int, n: Int): Int = {
        var count = 0
        var num1 = m
        var num2 = n
        while (num1 < num2){
            num1 = num1 >>> 1
            num2 = num2 >>> 1
            count += 1 
        } 
        return num1 << count
    }
}

//也可以借用之前的技巧 n & n-1 去除最右邊的1
//有題目條件易知, m <= n
//通過不斷對大數不斷去除右邊1,達到和m 01位置一致,實現最長公共二進位制字首
object Solution {
    def rangeBitwiseAnd(m: Int, n: Int): Int = {
        var count = 0
        var num1 = m
        var num2 = n
        while (num1 < num2){
            num2 = num2 & (num2-1) 
        } 
        return num2
    }
}