交替位二进制数
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
// Java Stream solution is not applicable in this context as streams are generally used for processing sequences of elements. However, we can still demonstrate an approach using Java Streams to manipulate bits in a functional style.
// This approach converts the integer to its binary string representation and checks if the bits are alternating.
import java.util.stream.IntStream;
public class StreamSolution {
public boolean hasAlternatingBits(int n) {
// Convert number to binary string
String binaryString = Integer.toBinaryString(n);
// Check if all adjacent characters are different
return IntStream.range(0, binaryString.length() - 1)
.allMatch(i -> binaryString.charAt(i) != binaryString.charAt(i + 1));
}
}
解释
方法:
该题解的思路是通过位运算来判断相邻两位是否不同。首先记录最低位 pre,然后右移 n,每次取出最低位 digit 与 pre 做异或操作,如果异或结果为0,说明相邻两位相同,返回 False。每次迭代更新 pre 为当前 digit,继续右移 n 直至为0。如果遍历完整个二进制数都没有返回 False,则说明符合条件,返回 True。
时间复杂度:
O(log(n))
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在比较两个相邻位的时候选择使用异或操作?这种方法如何确保能正确判断相邻位的关系?
▷🦆
在代码中,你是如何确保处理的是每一个位,特别是对于数值较大的输入?
▷🦆
如果二进制数的最高位和次高位相同,异或操作会返回什么结果?这会对算法的正确性产生什么影响?
▷🦆
在代码运行过程中,如果输入的 n 是最小值 1,这种情况下算法的表现如何?
▷相关问题
位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
提示:
- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
- 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 3 中,输入表示有符号整数
-3
。
示例 1:
输入:n = 00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:n = 00000000000000000000000010000000 输出:1 解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:n = 11111111111111111111111111111101 输出:31 解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
提示:
- 输入必须是长度为
32
的 二进制串 。
进阶:
- 如果多次调用这个函数,你将如何优化你的算法?