青训营X豆包MarsCode 刷题笔记 III |豆包MarsCode AI刷题

61 阅读3分钟

二进制之和问题刷题笔记


一、题目解析

问题描述
我们需要实现一个算法,能够将两个二进制字符串相加,并返回它们和的十进制形式。考虑到二进制字符串可能非常长,要求算法能够高效处理大数,并在时间复杂度 O(n2) 的范围内完成任务。

输入输出说明

  • 输入:两个二进制字符串 binary1 和 binary2。
  • 输出:一个字符串形式的十进制整数。

测试样例

  • 样例1:输入 "101" 和 "110",输出 "11"。
  • 样例2:输入 "111111" 和 "10100",输出 "83"。

二、解题思路

  1. 二进制转十进制

    • 使用 Long.parseLong(binary, 2) 将二进制字符串直接转换为十进制整数。
    • 这种方法可以高效处理较长的二进制字符串。
  2. 大数加法

    • 将两个十进制整数相加,得到最终结果。
  3. 十进制结果转字符串

    • 使用 String.valueOf(sum) 将结果转为字符串形式,满足输出要求。
  4. 复杂度分析

    • 二进制到十进制转换的时间复杂度约为 O(n),其中 n 是字符串长度。
    • 加法操作和字符串转换的时间复杂度均为常数级,整体复杂度约为 O(n)。

三、代码实现

以下是实现代码以及详细注释:

public class Main {
    public static String solution(String binary1, String binary2) {
        // 将第一个二进制字符串转换为十进制整数
        long num1 = Long.parseLong(binary1, 2);
        // 将第二个二进制字符串转换为十进制整数
        long num2 = Long.parseLong(binary2, 2);

        // 对两个十进制整数求和
        long sum = num1 + num2;

        // 将结果转为字符串形式输出
        return String.valueOf(sum);
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution("101", "110").equals("11")); // 二进制 5 + 6 = 十进制 11
        System.out.println(solution("111111", "10100").equals("83")); // 二进制 63 + 20 = 十进制 83
        System.out.println(solution("111010101001001011", "100010101001").equals("242420")); // 大数运算测试
        System.out.println(solution("111010101001011", "10010101001").equals("31220")); // 另一个大数测试
        System.out.println(solution("11", "1").equals("4")); // 二进制 3 + 1 = 十进制 4
    }
}

四、知识总结

  1. 二进制字符串操作

    • Java 提供了 Long.parseLong(binary, 2),可以高效地将二进制字符串直接转为十进制整数,简化了手动解析的复杂过程。
  2. 大数处理能力

    • Java 的 long 数据类型能够表示范围非常大的整数(范围:-2^63 到 2^63-1),足以应对一般的二进制加法问题。
  3. 高效字符串转换

    • 使用 String.valueOf() 方法可以快速将数字结果转为字符串形式,适用于所有数值类型。
  4. 时间复杂度

    • 主要操作是二进制转十进制,其时间复杂度为 O(n),其中 n 是二进制字符串的长度。加法和字符串转换的时间复杂度可以忽略。

五、学习建议

  1. 掌握 Java 内置工具

    • 熟练使用 Long.parseLongString.valueOf 等工具方法,能够极大地简化代码,提高效率。
  2. 处理大数问题

    • 在遇到二进制或大数计算问题时,优先考虑语言提供的高效数据类型或库。
  3. 代码测试覆盖

    • 测试时注意覆盖多种场景,例如:

      • 较短的二进制字符串。
      • 较长的大数。
      • 极限边界情况,如全是 1 的二进制字符串。

六、个人总结

本题充分利用了 Java 提供的高效内置方法,解决了二进制字符串到十进制整数的转换问题,代码简洁且高效。通过这次刷题,进一步体会到语言工具的重要性,以及在面对复杂问题时,借助工具的优势能够更快速地解决问题。