[LeetCode] 868. 二进制间距

给定一个正整数n,找到并返回n的二进制表示中两个相邻1之间的最长距离 。如果不存在两个相邻的1,返回0

如果只有 0 将两个 1 分隔开(可能不存在 0),则认为这两个 1 彼此相邻。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。

示例 1:

输入:n = 22
输出:2
解释:22 的二进制是 "10110" 。在 22 的二进制表示中,有三个 1,组成两对相邻的 1
第一对相邻的 1 中,两个 1 之间的距离为 2
第二对相邻的 1 中,两个 1 之间的距离为 1
答案取两个距离之中最大的,也就是 2

示例 2:

输入:n = 8
输出:0
解释:8 的二进制是 "1000"
在 8 的二进制表示中没有相邻的两个 1,所以返回 0 。

示例 3:

输入:n = 5
输出:2
解释:5 的二进制是 "101"

提示:

  • 1 <= n <= 109

思路:

用手动取模的方式获取各二进制,判断各位数值。遇到第一个1后开始记录0的个数, 遇到下一个1就重置计数并继续记录。不过输出的时候要加1,因为统计的是绝对位置差而不是0的个数。

AC代码:

class Solution {
public:
    int binaryGap(int n) {
        int zeroCounter = 0;
        int gapLength = 0;
        bool isGapStart = false;
        
        while (n > 0) {
            int currentDigit = n % 2;
            if (currentDigit == 1) {
                if (isGapStart) {
                    gapLength = max(gapLength, zeroCounter + 1);
                }
                isGapStart = true;
                zeroCounter = 0;
            } else if (isGapStart) {
                zeroCounter++;
            }
            n /= 2;
        }
        
        return gapLength;
    }
};Code language: C++ (cpp)