iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
1
Software Development

LeetCode30系列 第 13

[LeetCode30] Day13 - 201. Bitwise AND of Numbers Range

  • 分享至 

  • xImage
  •  

題目

給一個m與n,其中0 <= m <= n <= 2147483647 (2^32),形成一個範圍[m,n],計算m到n所有的數字做位元AND運算,並返回結果。

解法

  • 使用暴力法,把所有的AND起來,當然是一個方法,但如果今天m給0,n給最大2147483647,那不知道要做多久。所以我們來觀察一下:

  • 舉個例子:
    m = 11110101001 (binary)
    n = 11110101110 (binary)
    在此範圍內
    11110101001 (m)
    11110101010
    11110101011
    11110101100
    11110101101
    11110101110 (n)
    |------------|
    same part

  • 能觀察到 m到n的所有數字,前面都有11110101,那這部分做AND並不會改變,但接下來後面的位元,每個位置都會出現過0,故AND完一定是0。換言之,我們要保留的是m和n,從高最位元開始,持續相同的部分,即是答案。

  • 那我們能運用shift operator,只要m和n不同,就兩個數字的位元都往左移位,就如同一直把右邊砍掉,砍到剩下左邊相同的部分。最後再看shift幾次,把其中一個數字shift一樣的步數回去,就是答案了!

Code

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

https://ithelp.ithome.com.tw/upload/images/20200928/20129147zAKphRGyoz.png


上一篇
[LeetCode30] Day12 - 200. Number of Islands
下一篇
[LeetCode30] Day6 - 223. Rectangle Area
系列文
LeetCode3030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言