刷题笔记:55二进制之和 | 豆包MarsCode AI刷题

29 阅读2分钟

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

解题思路

  1. 二进制转十进制

    • 将二进制字符串转换为十进制整数。这可以通过遍历字符串中的每个字符,根据其位置计算出对应的十进制值来实现。
    • 例如,二进制字符串 "101" 对应的十进制值为 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5
  2. 十进制数相加

    • 将两个转换后的十进制数相加。
  3. 返回结果

    • 将相加后的十进制数转换为字符串并返回。

代码分析

主函数 solution

public static String solution(String binary1, String binary2) {
    long decimal1 = binaryToDecimal(binary1);
    long decimal2 = binaryToDecimal(binary2);
    long ans = decimal1 + decimal2;
    return String.valueOf(ans);
}
  • 参数binary1binary2 是两个二进制字符串。
  • 步骤
    1. 调用 binaryToDecimal 函数将 binary1 转换为十进制数 decimal1
    2. 调用 binaryToDecimal 函数将 binary2 转换为十进制数 decimal2
    3. 计算 decimal1decimal2 的和 ans
    4. ans 转换为字符串并返回。

辅助函数 binaryToDecimal

private static long binaryToDecimal(String binaryStr) {
    long decimal = 0;
    int length = binaryStr.length();
    for (int i = 0; i < length; i++) {
        char c = binaryStr.charAt(length - 1 - i);
        if (c == '1') {
            decimal += Math.pow(2, i);
        }
    }
    return decimal;
}
  • 参数binaryStr 是一个二进制字符串。
  • 步骤
    1. 初始化 decimal 为 0,用于存储最终的十进制值。
    2. 获取 binaryStr 的长度 length
    3. 遍历 binaryStr 的每个字符:
      • 从右到左(即从最低位到最高位)遍历字符串。
      • 如果当前字符是 '1',则将 2 的当前位次幂加到 decimal 上。
    4. 返回计算得到的十进制值 decimal

优化代码

    • 使用 Math.pow(2, i) 每次计算幂运算可能会导致性能问题。可以使用位移操作 1L << i 来替代 Math.pow(2, i),这样可以提高效率。
    • 例如,1L << i 等价于 2^i
    • 可以直接使用 Java 内置的 Long.parseLong 方法将二进制字符串转换为十进制数,这样可以简化代码。

优化后的代码

public static String solution(String binary1, String binary2) {
    long decimal1 = Long.parseLong(binary1, 2);
    long decimal2 = Long.parseLong(binary2, 2);
    long ans = decimal1 + decimal2;
    return String.valueOf(ans);
}

详细解释

  • Long.parseLong(binary1, 2) :将二进制字符串 binary1 转换为十进制长整型数。
  • Long.parseLong(binary2, 2) :将二进制字符串 binary2 转换为十进制长整型数。
  • String.valueOf(ans) :将相加后的结果 ans 转换为字符串并返回。