leetcode201 數字範圍按位與

2021-10-05 17:11:49 字數 794 閱讀 6762

給定範圍 [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],首先計算一下m和n的最高位是哪一位,即5–>101最高為是2,7–>111最高位也是2。這就表明m~n範圍內的數字最高位都是相同的,所以按位與的結果是1,將該結果加到res中,即res+= (1<<2)(因為1所處的位置是第二位),然後將左邊界m和右邊界n減去最高位,繼續迴圈該操作。

如果m和n的最高位不同,例如m=3–>11,n=7–>111,m的最高位是1,n的最高位是2,則表示該範圍內按位與的結果必定是0.(證明,假設範圍內的數字的二進位制形式在某位上的按位與是1。而範圍是連續的,且m和n的二進位制位數不同,則必定會有乙個與n位數相同的數字,在該位上是0.與假設矛盾)

class

solution

return count;

}int

rangebitwiseand

(int m,

int n)

return res;}}

;

leetcode 201 數字範圍按位與

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

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 外加乙個求漢明...