leetcode 201 數字範圍按位與

2021-10-01 05:03:59 字數 820 閱讀 4281

顯然,暴力解決方法是從m開始直到n求按位與,但很明顯這太慢了,雖然時間複雜度是o(n),但顯然不是乙個好的解法.我們可以注意到這樣一點,在數字加1的時候,最低位肯定會從0變成1,或者從1變成0,不管哪樣,兩個數的最低位中勢必有乙個0,而一旦出現了乙個0,這一位上的按位與結果將永遠為0.假如在m->n的增加過程中,m的最高位也發生了改變,那麼m之下的所有位都變成過0.那樣的話結果也只能是0了.我們再來看兩個相鄰的數,m,m+1,在+1的時候,改變的位可能是多個,而且改變一定是0->1或者1->0,因此,發生改變的位在求and操作後結果一定是0,因此只有那些沒有改變的位才能在and結果之後保留下來,於是對於m和m+1我們只要找到從最高位開始完全相同的位.同樣對於m+1和m+2也是如此.但是如果我們真的按照這個邏輯來的話就跟暴力解法一樣了.我們可以發現,對於m和n,找到他們從最高位開始完全相同的位,就是我們需要的結果.這也不難理解,m和n假如在最高位到x位之間的二進位制位完全相同,這就說明在遞增的過程中+1的操作永遠沒有改變過這些位,而相反第x-1到最後一位都至少改變過一次,而改變一定是0->1或者1->0,就是說在著m-n+1個運算元中至少有乙個的第i位(i>=0 && i<=x-1)為0.因此,第x-1位之下全都為0,m和n從最高位開始的連續相同部分就是我們要的結果.

演算法:偏移量offset = 0

當m,n都不為0時執行迴圈,進入3

如果m==n,返回m << offset,否則4

m,n均右移一位,offset加1,進入3

int

rangebitwiseand

(int m,

int n)

return0;

}

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,...

leetcode 201 數字範圍按位與

題目描述 給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 class solution while m n return n return n shift 外加乙個求漢明...