leetcode
leetcode 751 ~ 800
二进制间距

二进制间距

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 0.0 MB


// Java Stream Solution

// 思路:
// 1. 将整数 n 转换为二进制字符串。
// 2. 使用流(Stream)处理字符串,记录每个 '1' 的位置。
// 3. 计算每两个相邻 '1' 之间的距离,并记录最大距离。
// 4. 返回最大距离,如果没有相邻的 '1',返回 0。

import java.util.stream.IntStream;

public class Solution {
    public int binaryGap(int n) {
        String binaryString = Integer.toBinaryString(n);
        int[] positions = IntStream.range(0, binaryString.length())
            .filter(i -> binaryString.charAt(i) == '1')
            .toArray();

        if (positions.length < 2) {
            return 0;
        }

        int maxDistance = IntStream.range(1, positions.length)
            .map(i -> positions[i] - positions[i - 1])
            .max()
            .getAsInt();

        return maxDistance;
    }
}

解释

方法:

本题解采用位操作和循环的方法来求解最大的二进制间距。首先初始化间距d为一个较小的值(-32),这是因为n的最大值为10^9,其二进制表示最多有30位,初始化为-32可以保证第一个1之前不会误计算间距。变量res用来记录遇到的最大间距。通过不断右移n(N //= 2),使用位与操作(N & 1)判断最低位是否为1。如果为1,则更新res为当前的d(即上一个1之后经过的位数),并重置d为0。如果最低位不是1,则d递增,表示1之间的距离增加。这个过程一直持续到n变为0。

时间复杂度:

O(log n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么初始间隔d设置为-32,这个值具体的含义和作用是什么?
在算法中,d变量用于计算两个相邻1的间隔。初始间隔d设置为-32是为了确保在找到第一个1之前不会错误地计算间隔。因为n的最大值为10^9,其二进制表示最多有30位,设置为-32可以确保在遇到第一个1之前,d的值不会被错误地使用。这样,在算法中遇到第一个1时,d被重置为0,从而开始正确计算后续1之间的间隔。
🦆
如果n的值为0,这个算法是否会正确返回0,有没有处理这种边界情况?
如果n的值为0,算法也会正确地返回0。这是因为当N为0时,while循环不会执行,因此直接返回初始化的res值,即0。这种方式确保了即使在输入为0的边界情况下,算法也能正确处理并返回期望的结果。
🦆
代码中使用 `N & 1 == 1` 来判断最低位是否为1。这种方法是否总是可靠,或者存在某些条件下会失效?
使用 `N & 1 == 1` 来判断最低位是否为1是一种非常可靠的方法。这种位与运算确保只有当N的最低位是1时,结果才为1。位与运算直接对二进制位进行操作,不受其他因素影响,因此在所有条件下都是可靠的。
🦆
在二进制间距的计算中,d每次循环增加1的逻辑是怎样的?这是否意味着每次循环都代表n的二进制中移过一个位置?
在算法中,d每次循环增加1的逻辑用于记录自上一个1之后经过的位数。每次循环中,N通过右移操作(N //= 2)丢弃最低位,因此每次循环确实代表了n的二进制中移过一个位置。这样,每当遇到1时,d就表示了自上一个1后经过的位数,从而可以计算出两个1之间的间隔。

相关问题