力扣-第476题《数字的补数》

一 . 问题描述

对整数的二进制表示取反(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 变 11 变 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 的空间。

           StringBuilderO(log n),存储取反后的二进制字符串。

          总空间复杂度O(log n)

六 . 自我反思(优化建议)

  1. 避免字符串操作(减少 O(log n) 额外空间):

    • 直接通过位运算计算补数,无需转换字符串。

  2. 位运算优化

    • 找到 num 的最高有效位(如 5 的最高有效位是 3,因为 5 的二进制是 101)。

    • 构造一个掩码(mask),其二进制形式为全 1,且位数与 num 的有效位数相同(如 5 的掩码是 111,即 7)。

    • 补数 = mask ^ num(按位异或)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博哥爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值