二进制间距
难度:
标签:
题目描述
代码结果
运行时间: 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,这个值具体的含义和作用是什么?
▷🦆
如果n的值为0,这个算法是否会正确返回0,有没有处理这种边界情况?
▷🦆
代码中使用 `N & 1 == 1` 来判断最低位是否为1。这种方法是否总是可靠,或者存在某些条件下会失效?
▷🦆
在二进制间距的计算中,d每次循环增加1的逻辑是怎样的?这是否意味着每次循环都代表n的二进制中移过一个位置?
▷