201 數字範圍按位與 lecot

2021-10-24 04:12:52 字數 983 閱讀 1353

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

示例 1:

輸入: [5,7]

輸出: 4

示例 2:

輸入: [0,1]

輸出: 0

思路:1.這道題剛看見時,很容易想到迭代所有的數字進行按位與,但因為次數太多會超時

解題規律:【sss0***x,sss1***x】,(二進位制表示,其中s表示兩數的該位相同,x表示兩數的該位可同可不同)

那麼答案為sss00000

證明:1.現在考慮到我們按位與的數是連續的,那麼sss0***x到sss1***x之間必有兩數 sss01111和sss10000

2.考慮按位與的特點:只要有乙個數的某一位是0,則最後結果的這位一定位0.所以sss01111和sss1000按位與得sss00000

3.所以我們要找出所有數的公共字首sss,而最小數和最大數的公共字首必是所有數唯一的公共字首。

**:

class

solution

:def

rangebitwiseand

(self, m:

int, n:

int)

->

int:

shift =

0# 找到公共字首

while m < n:(找公共字首)

m = m >>

1 n = n >>

1 shift +=

1return m << shift(公共字首復位)

例【13,15】為【00001101,00001111】,字首000011,復位後00001100,答案12.

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從左起相同...

位運算 201 數字範圍按位與

給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5 7 輸出 4示例 2 輸入 0 1 輸出 0解題 方法1 位移 所有數字按位與,即找到所有數字的公共字首 所有數字的公共字首,即最大和最小數字的公共字首 故將m和n右移,...