一 . 问题描述
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
- 例如,整数
5的二进制表示是"101",取反后得到"010",再转回十进制表示得到补数2。
给你一个整数 num ,输出它的补数。
二 . 了解概念
在 Java 中,StringBuilder 是一个可变的字符序列,用于高效地构建和修改字符串。与 String(不可变)相比,StringBuilder 在频繁修改字符串时性能更好,因为它避免了不必要的对象创建和内存复制。
本题用到append方法意为字符串的拼接
str.append("1"); // 追加 "1"
str.append("0"); // 追加 "0"
三 . 解题思路
将整数转换为二进制字符串:使用 Integer.toBinaryString(num) 获取其二进制表示(不带前导零)。
逐位取反:遍历二进制字符串,0 变 1,1 变 0。
将取反后的二进制字符串转回十进制:使用 Integer.parseInt(str, 2) 解析。
四 . 解题过程
public static int findComplement(int num) {
String binaryString = Integer.toBinaryString(num);
StringBuilder str = new StringBuilder();
for (int i = 0; i < binaryString.length(); i++) {
if (binaryString.charAt(i) == '0') {
str.append("1");
} else if (binaryString.charAt(i) == '1') {
str.append("0");
}
}
return Integer.parseInt(str.toString(), 2);
}
五 . 时间复杂度和空间复杂度
1 . 时间复杂度
Integer.toBinaryString(num):O(log n),因为整数的二进制位数是 ⌊log₂n⌋ + 1。
遍历二进制字符串:O(log n),因为需要处理每一位。
Integer.parseInt(str, 2):O(log n),解析二进制字符串的时间与位数成正比。
总时间复杂度:O(log n)(线性于二进制位数)。
2 . 空间复杂度
二进制字符串存储:O(log n),存储二进制字符串需要 ⌊log₂n⌋ + 1 的空间。
StringBuilder:O(log n),存储取反后的二进制字符串。
总空间复杂度:O(log n)。
六 . 自我反思(优化建议)
-
避免字符串操作(减少
O(log n)额外空间):-
直接通过位运算计算补数,无需转换字符串。
-
-
位运算优化:
-
找到
num的最高有效位(如5的最高有效位是3,因为5的二进制是101)。 -
构造一个掩码(mask),其二进制形式为全
1,且位数与num的有效位数相同(如5的掩码是111,即7)。 -
补数 =
mask ^ num(按位异或)。
-

被折叠的 条评论
为什么被折叠?



