AI刷题二进制之和|豆包MarsCode AI刷题

50 阅读4分钟

问题解析

这道题要求我们编写一个程序,将两个二进制字符串相加并返回它们的和,结果以十进制字符串的形式呈现。题目中提到输入的二进制字符串可能非常长,因此我们需要一种能够处理大数的方法。

解题思路

  1. 使用大数库

    • Java 提供了 BigInteger 类,可以处理任意大小的整数运算。我们可以利用这个类将二进制字符串转换为大整数,进行加法运算,然后将结果转换回十进制字符串。
    • 这种方法简单且高效,适用于处理非常大的二进制数。
  2. 时间复杂度

    • 使用 BigInteger 进行加法运算的时间复杂度为 (O(n)),其中 (n) 是二进制字符串的长度。这满足题目中关于时间复杂度的要求(不超过 (O(n^2)))。
  3. 步骤

    • 将两个二进制字符串分别转换为 BigInteger 对象。
    • 对这两个大整数进行加法运算。
    • 将结果转换为十进制字符串并返回。

代码解析

import java.math.BigInteger;

public class Main {
    /**
     * 将两个二进制字符串相加并返回结果(十进制字符串)。
     *
     * @param binary1 第一个二进制字符串
     * @param binary2 第二个二进制字符串
     * @return 两个二进制字符串的和,以十进制字符串表示
     */
    public static String solution(String binary1, String binary2) {
        // 将二进制字符串转换为 BigInteger 对象,指定基数为 2
        BigInteger num1 = new BigInteger(binary1, 2);
        BigInteger num2 = new BigInteger(binary2, 2);
        
        // 对两个 BigInteger 对象进行加法运算
        BigInteger sum = num1.add(num2);
        
        // 将结果转换为十进制字符串并返回
        return sum.toString();
    }

    /**
     * 主方法,用于测试 solution 方法。
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 测试样例 1
        String binary1 = "101";
        String binary2 = "110";
        String expected = "11";
        String result = solution(binary1, binary2);
        System.out.println("Test Case 1: " + (result.equals(expected) ? "Passed" : "Failed"));
        System.out.println("Input: binary1 = " + binary1 + ", binary2 = " + binary2);
        System.out.println("Output: " + result);
        System.out.println("Expected: " + expected);
        System.out.println();

        // 测试样例 2
        binary1 = "111111";
        binary2 = "10100";
        expected = "83";
        result = solution(binary1, binary2);
        System.out.println("Test Case 2: " + (result.equals(expected) ? "Passed" : "Failed"));
        System.out.println("Input: binary1 = " + binary1 + ", binary2 = " + binary2);
        System.out.println("Output: " + result);
        System.out.println("Expected: " + expected);
        System.out.println();

        // 测试样例 3
        binary1 = "111010101001001011";
        binary2 = "100010101001";
        expected = "242420";
        result = solution(binary1, binary2);
        System.out.println("Test Case 3: " + (result.equals(expected) ? "Passed" : "Failed"));
        System.out.println("Input: binary1 = " + binary1 + ", binary2 = " + binary2);
        System.out.println("Output: " + result);
        System.out.println("Expected: " + expected);
        System.out.println();

        // 额外测试样例
        binary1 = "111010101001011";
        binary2 = "10010101001";
        expected = "31220";
        result = solution(binary1, binary2);
        System.out.println("Test Case 4: " + (result.equals(expected) ? "Passed" : "Failed"));
        System.out.println("Input: binary1 = " + binary1 + ", binary2 = " + binary2);
        System.out.println("Output: " + result);
        System.out.println("Expected: " + expected);
        System.out.println();
    }
}

代码说明

  1. 方法 solution

    • 参数
      • binary1:第一个二进制字符串。
      • binary2:第二个二进制字符串。
    • 步骤
      • 使用 new BigInteger(binary1, 2)binary1 转换为十进制大整数。
      • 同样地,使用 new BigInteger(binary2, 2)binary2 转换为十进制大整数。
      • 使用 add 方法将两个大整数相加。
      • 使用 toString() 方法将结果转换为十进制字符串并返回。
  2. 主方法 main

    • 用于测试 solution 方法。
    • 包含四个测试样例:
      • 前三个样例与题目中提供的样例一致。
      • 第四个样例是一个额外的测试,用于验证代码的通用性。

运行结果

运行上述代码,输出如下:

Test Case 1: Passed
Input: binary1 = 101, binary2 = 110
Output: 11
Expected: 11

Test Case 2: Passed
Input: binary1 = 111111, binary2 = 10100
Output: 83
Expected: 83

Test Case 3: Passed
Input: binary1 = 111010101001001011, binary2 = 100010101001
Output: 242420
Expected: 242420

Test Case 4: Passed
Input: binary1 = 111010101001011, binary2 = 10010101001
Output: 31220
Expected: 31220

所有测试样例均通过,说明代码正确实现了将两个二进制字符串相加的功能。

总结

使用 BigInteger 类可以简化大数运算的复杂性,并且能够有效地处理非常大的二进制字符串。这种方法不仅代码简洁,而且性能也足够满足大多数应用场景的需求。