330-二进制反码转换问题 | 豆包MarsCode AI刷题

62 阅读4分钟

问题描述

小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。

二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。


测试样例

样例1:

输入:N = 5 输出:2

样例2:

输入:N = 10 输出:5

样例3:

输入:N = 0 输出:1

解题思路

拿到这道题的时候,其实心里已经做过很多遍,毕竟真的很常见,取二进制,取反,再转成十进制。

拆解出来:

  • 题目要求我们计算一个非负整数 N 的二进制反码对应的十进制数。
  • 二进制反码的定义是将二进制表示中的每个 1 变为 0,每个 0 变为 1

从数据结构的选择方面:

  • 我们需要将整数 N 转换为二进制字符串。
  • 然后对二进制字符串的每一位进行取反操作。
  • 最后将取反后的二进制字符串转换回整数。

具体的算法步骤:

我想起来java有个方法是恶意将整数转成二进制字符串来着

  • 使用 Integer.toBinaryString(N) 方法将整数 N 转换为二进制字符串。
  • 遍历二进制字符串的每一位,将 0 变为 1,将 1 变为 0,并存储在新的字符串中。
  • 使用 Integer.parseInt(reversedBinary.toString(), 2) 方法将取反后的二进制字符串转换回整数。

代码

public class Main {
    public static int solution(int N) {
        // 将整数 N 转换为二进制字符串
        String binaryString = Integer.toBinaryString(N);
        
        // 将二进制字符串的每一位取反
        StringBuilder reversedBinary = new StringBuilder();
        for (char c : binaryString.toCharArray()) {
            // 如果当前字符是 '0',则变为 '1',否则变为 '0'
            if (c == '0') {
                reversedBinary.append('1');
            } else {
                reversedBinary.append('0');
            }
        }
        
        // 将取反后的二进制字符串转换回整数
        return Integer.parseInt(reversedBinary.toString(), 2);
    }

    public static void main(String[] args) {
        System.out.println(solution(5) == 2 ? 1 : 0);
        System.out.println(solution(10) == 5 ? 1 : 0);
        System.out.println(solution(0) == 1 ? 1 : 0);
    }
}

关键的地方就是将整数 N 转换为二进制字符串:使用 Integer.toBinaryString(N)将二进制字符串的每一位取反:遍历字符串,将 0 变为 1,将 1 变为 0将取反后的二进制字符串转换回整数:使用 Integer.parseInt(reversedBinary.toString(), 2)

个人的感悟与思考

时间复杂度

  1. 将整数 N 转换为二进制字符串

    使用 Integer.toBinaryString(N) 方法的时间复杂度是 O(log N),因为二进制字符串的长度是 log N 位。

  2. 遍历二进制字符串并取反

    遍历二进制字符串的时间复杂度是 O(log N),因为我们需要遍历每一位。

  3. 将取反后的二进制字符串转换回整数:使用 Integer.parseInt(reversedBinary.toString(), 2) 方法的时间复杂度是 O(log N),因为我们需要解析 log N 位的字符串。

空间复杂度

  1. 存储二进制字符串

    存储 N 的二进制表示需要 O(log N) 的空间。

  2. 存储取反后的二进制字符串

    存储取反后的二进制字符串也需要 O(log N) 的空间。

所以总的来讲时间复杂度和空间复杂度都是要O(log N)来处理。

碎碎念

通过这个练习,我不仅提升了自己的编程技能,还学到了一些关于二进制运算和字符串处理的知识。我深刻体会到,编程不仅仅是写代码,更重要的是理解问题、设计算法、编写代码以及测试和调试。每一个环节都需要认真对待,只有这样,才能写出高质量的代码。

比如在设计好算法后,我开始编写代码,我使用了 Integer.toBinaryString(N) 方法将整数转换为二进制字符串,使用 StringBuilder 来存储取反后的二进制字符串,并使用 Integer.parseInt(reversedBinary.toString(), 2) 方法将取反后的二进制字符串转换回整数。编写代码的过程中,我注意到了代码的可读性和简洁性,尽量使代码易于理解和维护。

编程是一个不断学习和成长的过程,只有不断地练习和挑战自己,才能不断提升自己的水平。

在未来的学习和工作中,我会继续保持这种积极的态度,不断挑战自己,提升自己的能力。