友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

476. 数字的补数

对整数的二进制表示取反(0110)后,再转换为十进制表示,可以得到这个整数的补数。

  • 例如,整数 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;
}