[LeetCode] 868. Binary Gap 二進制間隙



Given a positive integer N, find and return the longest distance between two consecutive 1's in the binary representation of N.html

If there aren't two consecutive 1's, return 0.git

Example 1:github

Input: 22
Output: 2
Explanation:
22 in binary is 0b10110.
In the binary representation of 22, there are three ones, and two consecutive pairs of 1's.
The first consecutive pair of 1's have distance 2.
The second consecutive pair of 1's have distance 1.
The answer is the largest of these two distances, which is 2.

Example 2:數組

Input: 5
Output: 2
Explanation:
5 in binary is 0b101.

Example 3:code

Input: 6
Output: 1
Explanation:
6 in binary is 0b110.

Example 4:htm

Input: 8
Output: 0
Explanation:
8 in binary is 0b1000.
There aren't any consecutive pairs of 1's in the binary representation of 8, so we return 0.

Note:blog

  • 1 <= N <= 10^9



這道題給了咱們一個正整數,問其二進制表示數中兩個 '1' 之間的最大距離是多少。好比整數 22 的二進制爲 10110,那麼能夠看出前兩個 '1' 之間的距離最大,因此返回2便可。其實這道題的考察點就是如何按位取數,對一個二進制數直接與 '1',就能夠提取出最低位,而後和0比較大小,就知道最低位是0仍是1了。固然爲了每一位的是0仍是1,通常有兩種處理方法,一種是直接將原數字右移一位,則以前的最低位被移除了,再和 '1' 相與便可,直到原數字變爲0中止。另外一種方法是直接右移固定的位數再與 '1',由於整型數只有 32 位,因此能夠直接取出任意位上的數字。那麼既然要求兩個 '1' 之間的最大距離,那麼只要關心 '1' 的位置便可,一種比較直接的思路就是先遍歷一遍各位上的數字,將全部 '1' 的座標位置都保存到一個數組 pos 之中,而後再遍歷這個 pos 數組,計算相鄰兩個數字的差,即兩個 '1' 之間的距離,更新結果 res 便可獲得最大距離,參見代碼以下:three



解法一:leetcode

class Solution {
public:
    int binaryGap(int N) {
        vector<int> pos;
        for (int i = 0; i < 32; ++i) {
            if (((N >> i) & 1) != 0) pos.push_back(i);
        }
        int res = 0, n = pos.size();
        for (int i = 1; i < n; ++i) {
            res = max(res, pos[i] - pos[i - 1]);
        }
        return res;
    }
};



咱們也能夠只用一個循環來完成,並且不用 pos 數組,只用一個變量 last 來記錄上一個遍歷到的 '1' 的位置,初始化爲 -1。那麼在遍歷的過程當中,若遇到了 '1',則判斷 last 是否大於等於0,是的話則表示以前已經遇到了 '1',那麼當前位置i減去 last,即爲兩個 '1' 之間的距離,用來更新結果 res,而後再更新 last 爲當前位置i,繼續遍歷便可,參見代碼以下:get



解法二:

class Solution {
public:
    int binaryGap(int N) {
        int res = 0, last = -1;
        for (int i = 0; i < 32; ++i) {
            if (((N >> i) & 1) != 0) {
                if (last >= 0) res = max(res, i - last);
                last = i;
            }
        }
        return res;
    }
};



Github 同步地址:

https://github.com/grandyang/leetcode/issues/868



參考資料:

https://leetcode.com/problems/binary-gap/

https://leetcode.com/problems/binary-gap/discuss/149945/Simple-Java-(10-ms)

https://leetcode.com/problems/binary-gap/discuss/149835/C%2B%2BJavaPython-Dividing-by-2



LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索