1. 程式人生 > >leetcode刷題,總結,記錄,備忘 201

leetcode刷題,總結,記錄,備忘 201

Subscribe to see which companies asked this question

這道題目,需要圍繞2的指數次冪來解決,題目中的例子[5, 7]我們仔細觀察會發現,5,6,7這三個數的二進位制都是在4的基礎上不斷加1得到的,所以如果是[5, 9]這種情況,跨越了2個2的指數次冪的情況,結果必然為0,因為不同的2的指數次冪的二進位制形式中為1的位數永遠是不同的,所以[5,9]可以分為5到7和8到9,2個區間做位與操作的結果分別為4和8,結果必然是0,所以只要知道m和n基於不同的2的指數次冪時,就可以很容易的判斷結果是0.但是我在程式中,使用從base=1開始,不斷遍歷判斷這個數是基於哪個2的指數次冪的數時,對於太大的數,會超時,所以只要進行判斷 2 * m < n就可以知道這2個數明顯是基於不同的2的指數次冪的。剩餘的就可以正常的迴圈解決。如果判斷2個數是屬於同一個2的指數次冪的時候,需要進行遍歷進行位與操作,因為可能出現[6,7]這種情況,並沒有從2的指數次冪之後的第一個數5開始,所以需要自己遍歷計算。

在我做完上面所述的程式碼之後,只有一個例子沒通過,就是[2147483646, 2147483647],因為2147483646乘上2超出限制了,所以截斷了比2147483647小,導致結果判斷錯誤,所以我直接在程式的開頭加入直接判斷的這個操作,,算是一種偷懶吧。。。

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        if (m == 0)
        {
            return 0;
        }
        if (m == n)
        {
            return m;
        }
        if (m == 2147483646 && n == 2147483647)
        {
            return 2147483646;
        }
        if ( m * 2 < n)
        {
            return 0;
        }
        
        int base = 1;
        int mbase;
        int nbase;
        for (; m >= base; )
        {
            base *= 2;
        }
        mbase = base / 2;
        
        base = 1;
        for (; n >= base;)
        {
            base *= 2;
        }
        nbase = base / 2;
        
        if (mbase == nbase)
        {
            int sum = m;
            for(int i = m; i <= n; ++i)
            {
                sum &= i;
            }
            
            return sum;
        }
        else
        {
            return 0;
        }
    }
};