LeetCode201 數字範圍按位與

2022-08-11 09:12:14 字數 1054 閱讀 5969

暴力做法是,列舉從m~n的所有數,因為題目說了資料最大為2147483647,所以可以列舉0~30位,對所有數字的每一位做與運算。

資料比較大的時候這樣做會超時(時間複雜度是o(n))。

參考官方題解,有乙個簡單得多的做法。

觀察發現,要對所有數做按位與,只要有乙個數的某一位為0,則最後按位與的結果在這一位肯定也是0。

比如9, 10, 11, 12四個數做按位與,低三位各有乙個數在那個位為0,因此最終按位與的結果在低三位肯定也是0,只有倒數第四位,四個數都是1,因此按位與的結果是1,所以最終所有數按位與的結果在倒數第四位也是1。

更高位的數就都是0了,沒什麼好說的。

可以發現,按位與的結果就是所有數的二進位制公共字首,低位全部是0.比如上面例子中公共字首是倒數第四位的1,低三位都是0,所以結果就是1 0 0 0,也就是8.

因為從m到n,每乙個數是逐漸加一的,每次加一,會從低位開始變化,所以所有數的公共字首,就是左右端點m和n的公共字首,所以我們只需要找到m和n的公共字首,然後低位都補上0就可以了。

找公共字首的方法可以用右移操作,同時右移m和n直到兩個數相等,當然要記錄位移的次數,然後把m(或n,此時m和n兩個數已經相等了,就是他們的公共字首)左移他們的位移次數(也就相當於低位補0)就是最後的答案了。

比如上圖,9和12右移3次之後相等了,也就是找到公共字首1,然後把1左移三次,就是9~12之間所有的數的按位與的結果了。

**如下:

class solution 

return m << shift; //退出while迴圈後,m和n就是公共字首了,左移shift次就是答案}};

leetcode 201 數字範圍按位與

顯然,暴力解決方法是從m開始直到n求按位與,但很明顯這太慢了,雖然時間複雜度是o n 但顯然不是乙個好的解法 我們可以注意到這樣一點,在數字加1的時候,最低位肯定會從0變成1,或者從1變成0,不管哪樣,兩個數的最低位中勢必有乙個0,而一旦出現了乙個0,這一位上的按位與結果將永遠為0 假如在m n的增...

leetcode201 數字範圍按位與

給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5 7 輸出 4示例 2 輸入 0 1 輸出 0首先,如果m 0,則範圍內按位與的結果必定是0 如果m n 則表示範圍內只有乙個數字,結果必定是m 假設 m 5,n 7 首先...

leetcode 201 數字範圍按位與

記一次失敗的解題經歷,想跑捷徑,最後發現還是最初的起點比較快 題目如下 201.數字範圍按位與 難度中等112收藏分享切換為英文關注反饋 給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4示例 2 輸入 0,...