数字的补数
难度:
标签:
题目描述
对整数的二进制表示取反(0
变 1
,1
变 0
)后,再转换为十进制表示,可以得到这个整数的补数。
- 例如,整数
5
的二进制表示是"101"
,取反后得到"010"
,再转回十进制表示得到补数2
。
给你一个整数 num
,输出它的补数。
示例 1:
输入:num = 5 输出:2 解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:
输入:num = 1 输出:0 解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
提示:
1 <= num < 231
注意:本题与 1009 https://leetcode-cn.com/problems/complement-of-base-10-integer/ 相同
代码结果
运行时间: 20 ms, 内存: 0.0 MB
// Java Stream solution
// 思路: 我们首先将num的二进制表示存储在一个字符串中,然后使用Java Streams来计算补数。
// 步骤如下:
// 1. 将num转换为二进制字符串。
// 2. 使用Stream对字符串进行处理,将每个'0'替换为'1',每个'1'替换为'0'。
// 3. 将处理后的二进制字符串转换为整数。
import java.util.stream.Collectors;
public class Solution {
public int findComplement(int num) {
String binaryString = Integer.toBinaryString(num);
String complementString = binaryString.chars()
.mapToObj(c -> c == '0' ? '1' : '0')
.map(Object::toString)
.collect(Collectors.joining());
return Integer.parseInt(complementString, 2); // 将二进制字符串转换为整数
}
}
解释
方法:
这个题解的思路是利用异或运算的性质来求补数。具体来说,先计算出一个和 num 二进制位数相同的掩码,掩码的所有位都是 1,然后将掩码和 num 进行异或运算,得到的结果就是 num 的补数。计算掩码的方法是将 1 左移 num 的二进制位数减 1 位,然后再减 1。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么要使用异或运算来求补数,而不是直接对每个二进制位进行取反操作?
▷🦆
掩码的生成方式是如何确保与原数 num 的二进制位数完全对应的?
▷🦆
在计算掩码时,操作`(1 << num_bits) - 1`的具体含义是什么?为什么这样操作就能生成全1的掩码?
▷🦆
对于特殊的输入如最大的 32 位整数,这种方法仍然适用吗?如何处理溢出或边界条件?
▷