[LeetCode] 868. 二進制間距

1 題目描述

給定一個正整數 N,找到並返回 N 的二進制表示中兩個連續的 1 之間的最長距離。

如果沒有兩個連續的 1,返回 0 。

示例 1:

輸入:22
輸出:2
解釋:
22 的二進制是 0b10110 。
在 22 的二進制表示中,有三個 1,組成兩對連續的 1 。
第一對連續的 1 中,兩個 1 之間的距離爲 2 。
第二對連續的 1 中,兩個 1 之間的距離爲 1 。
答案取兩個距離之中最大的,也就是 2 。
示例 2:

輸入:5
輸出:2
解釋:
5 的二進制是 0b101 。
示例 3:

輸入:6
輸出:1
解釋:
6 的二進制是 0b110 。
示例 4:

輸入:8
輸出:0
解釋:
8 的二進制是 0b1000 。
在 8 的二進制表示中沒有連續的 1,所以返回 0 。

提示:

1 <= N <= 10^9

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-gap
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

解決方法:存儲索引

思路

由於我們想要檢查數字 N 的二進制表示法中連續的 1 之間的距離,讓我們先記錄下該二進制表示中每個 1 的索引。例如,如果 N = 22 = 0b10110,那麼我們將記錄 A = [1, 2, 4]。這使得我們可以容易地繼續,原問題被轉換爲關於數組中相鄰值的問題。

算法

創建一個關於索引 i 的列表 A, N 在第 i 位上的值爲 1。

有了這個數組 A,找到連續的 1 之間的距離就變得容易得多:它會是這個數組相鄰值之間的最大差值。

3 解決代碼

  • Java代碼
class Solution {
    public int binaryGap(int N) {
        int[] A = new int[32];
        int n = 0;
        for (int i = 0; i < 32; i++)
            if (((N >> i) & 1) != 0)
                A[n++] = i;

        int ans = 0;
        for (int i = 0; i < n - 1; i++)
            ans = Math.max(ans, A[i+1] - A[i]);
        return ans;
    }
}
  • python代碼
class Solution(object):
    def binaryGap(self, N):
        """
        :type N: int
        :rtype: int
        """
        A = [i for i in xrange(32) if (N>>i) &1]
        if(len(A) <2):return 0
        return max(A[i+1] - A[i] for i in xrange(len(A) -1))
發佈了242 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章