给定一个正整数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)