數字範圍按位與

2021-10-06 16:42:46 字數 1436 閱讀 4033

給定乙個範圍[m, n] 0 <= m, n <= 2147483647,返回此閉區間內的所有數字進行與運算後的結果。

這是一道leetcode上的經典題目,下面我將介紹兩種解法,當然有興趣的可以去原**看一下具體題目和官方解答。

這種解法是最簡單的,包括我一開始也是這樣做的。

具體**如下:

class

solution

};

時間複雜度為o(n),leetcode的編譯器是通不過這個複雜度的。何況題目難度為medium,題目要求肯定不會讓我們這麼。

另外,如果有不了解位運算的,可以看一下我的另一篇部落格《位運算知識點總結》。

我們先觀察9到12的二進位制。

當我們進行與運算的時候,要想成立, 所有位必須為1,反之,如果有一數上的對應位為0的話,計算的結果肯定為0。再觀察上面每乙個數的二進位制,他們的二進位制一定有乙個公共字首(黃色標註)。

這個公共字首的與運算一定是等於這個公共字首的。

而任意兩個數的與運算,除了公共字首之外,它的字尾進行與運算的話一定是等於0的,大家不妨拿上筆多試幾個數可以發現這個規律。

所以!!這道題由計算它的與運算,轉向找到它的公公字首後就可以得到答案了。

如何計算,在看完**後,大家一定能夠知道。

class

solution

// 還原

return m << ans;}}

;

時間複雜度為o(1),因為我們只用了常數級的資料來計算公共字首

此解法,我就簡單講一下了,我們在進行計算的時候,實則其實就找到兩個數的公共字首就行了,然後向左移位,就把字尾全部變成0了。

其實還有一種解法,我們可以把二進位制最右邊的1變成0。

n = n & (n - 1),這個公式就可以把我們乙個數的二進位制最右邊的1變成0,具體可以結合上面的思考。

我們參考上面的資料,要計算 9 到 12 的所有數的與運算,其實就是把 12 的 二進位制右邊的 1 不斷的變成 0 ,直到其二進位製成為0000 1000,此時肯定比 9 小,那麼我們就可以退出迴圈了,然後將 9 與0000 1000進行與運算就得到答案了,其實我們不斷的把 12 右邊第乙個 1 變成 0 的過程,就是在求公共字首。

class

solution

return n & m;}}

;

時間複雜度o(1)

201 數字範圍按位與

給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 方法一 位移 思路鑑於上述問題的陳述,我們的目的是求出兩個給定數字的二進位制字串的公共字首,這裡給出的第乙個方法是採用位移...

201 數字範圍按位與

給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 1.暴力 2.規律,len n len m return 0 len n len m 將m,n 二進位制,m和n從左起相同...

數字範圍按位與(位運算 思維)

題目 給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 思路 一種直觀解法是將 n,m 的不同地位部分都變為0,可以逐位右移,再左移回來即可,這個做法挺快的。而還有一種可以利用我們的樹狀陣列的lowbit來搞,如下。class soluti...