问题描述
给定一个正整数 n
,找到其中最大的二进制位上的间隙长度。二进制位上的间隙是指在二进制表示中,两个 1 之间的 0 的数量。
示例 1: 输入: n = 22 输出: 2 解释: 22 的二进制是 10110。 在 22 的二进制表示中,有四个间隙 3, 1, 1, 和 2。 最大间隙是 2。
示例 2: 输入: n = 5 输出: 2 解释: 5 的二进制是 101。 在 5 的二进制表示中,有六个间隙 2, 2, 1, 1, 2, 和 0。 最大间隙是 2。
示例 3: 输入: n = 6 输出: 1 解释: 6 的二进制是 110。 在 6 的二进制表示中,有五个间隙 1, 1, 2, 1, 和 0。 最大间隙是 1。
示例 4: 输入: n = 8 输出: 0 解释: 8 的二进制是 1000。 在 8 的二进制表示中,没有间隙。
解法一
解题思路:
我们需要遍历整数的二进制表示,找到 1 之间的 0 的最大数量。我们可以从最低位开始,一旦发现 1,就开始计数 0 的数量,直到下一个 1 出现。
/*
* @lc app=leetcode.cn id=868 lang=javascript
*
* [868] Binary Gap
*/
// @lc code=start
function binaryGap(n) {
let maxGap = 0, currentGap = 0;
let seenOne = false;
for (let i = 0; i < 32; i++) {
if ((n & (1 << i)) !== 0) {
if (seenOne) {
maxGap = Math.max(maxGap, currentGap);
currentGap = 0;
} else {
seenOne = true;
}
} else if (seenOne) {
currentGap++;
}
}
return maxGap;
}
// @lc code=end