友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
476. 数字的补数
对整数的二进制表示取反(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-complement-of-base-10-integer] 相同
思路分析
先求出每个比特位的值,然后按位取反,再用 二进制转十进制的算法转换回去即可。
看题解有更牛逼的思路,比如:
输入为 5 是 101
输出为 2 是 010
上下两个加起来就是 111 即2的3次方-1
输入为 8 是 1000
输出为 7 是 0111
上下两个加起来就是 1111 即2的4次方-1
同理
就可以知道
找到一个比num大的 2的n次幂的数 本题为 a
然后结果就是 a - num - 1
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2025-09-02 21:49:25
*/
public int findComplement(int num) {
int[] bits = new int[32];
int cnt = 0;
while (cnt < bits.length) {
bits[cnt] = num & 1;
num >>= 1;
if (num > 0) {
cnt++;
} else {
break;
}
}
int result = bits[cnt--] == 0 ? 1 : 0;
while (cnt >= 0) {
result = (result * 2) + (bits[cnt] == 0 ? 1 : 0);
cnt--;
}
return result;
}