leetcode筆記:Bitwise AND of Numbers Range

一. 題目描述

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

二. 題目分析

給定一個範圍[m, n],其中 0 <= m <= n <= 2147483647,返回範圍內所有整數的按位與,包括邊界mn。比如給定範圍爲[5, 7], 應返回4

單看題目描述,可以知道該題涉及到位運算,因此需動筆分析:

對於題目給定的範圍[5, 7],可寫爲:

5: 101
6: 110  -> 100 -> 4
7: 111

再來兩個例子:

範圍[6, 8]:

6: 0110
7: 0111  -> 0000 -> 0
8: 1000

範圍[8, 10]:

8:  1000
9:  1001  -> 1000 -> 4
10: 1010

現在可以總結出規律了,對於範圍[m, n],若n的最高有效位比m的最高有效位要高,則必然會出現像例子出現的情況,必然在範圍內存在兩個數,這兩個數分別是對方的反碼:

6: 0110
7: 0111  -> 0000 -> 0
8: 1000

因此,只有當mn的最高有效位一致時,即m與n同時右移n位,且m == n,m == 1時按位與結果不爲0,且該結果爲mn的公共左邊首部,以下給出簡單的代碼:

三. 示例代碼

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        int bits = 0;
        while (m != n)
        {
            m >>= 1;
            n >>= 1;
            ++bits;
        }
        return m << bits;
    }
};

四. 小結

該題是數學問題,用位運算即可快速解決,主要是要找出規律。

發佈了249 篇原創文章 · 獲贊 99 · 訪問量 115萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章