leetcode刷題,總結,記錄,備忘 201
阿新 • • 發佈:2019-01-10
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; } } };