青训营—二进制反码转换问题

58 阅读1分钟

题目描述

小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

思路

  1. 二进制表示:每个非负整数可以用二进制表示。例如,5 的二进制表示为 10110 的二进制表示为 1010
  2. 反码表示:反码表示是将二进制数中的每个 1 变为 0,每个 0 变为 1。例如,101 的反码是 010
  3. 十进制转换:反码的二进制表示可以被转换回十进制数。

Java代码

public class Main {
    public static int solution(int N) {
        // write code here
        // 将十进制数 N 转换为二进制字符串
        String binaryString = Integer.toBinaryString(N);
        StringBuilder binaryStringBuilder = new StringBuilder(binaryString);
        
        // 生成反码
        for (int i = 0; i < binaryStringBuilder.length(); i++) {
            if (binaryStringBuilder.charAt(i) == '1') {
                binaryStringBuilder.setCharAt(i, '0');
            } else {
                binaryStringBuilder.setCharAt(i, '1');
            }
        }
        
        // 将反码的二进制字符串转换为十进制数
        int result = Integer.parseInt(binaryStringBuilder.toString(), 2);
        return result;
    }

    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);
    }
}

复杂度分析

时间复杂度和空间复杂度均为O(n)。