问题解析
这道题要求我们编写一个程序,将两个二进制字符串相加并返回它们的和,结果以十进制字符串的形式呈现。题目中提到输入的二进制字符串可能非常长,因此我们需要一种能够处理大数的方法。
解题思路
-
使用大数库:
- Java 提供了
BigInteger类,可以处理任意大小的整数运算。我们可以利用这个类将二进制字符串转换为大整数,进行加法运算,然后将结果转换回十进制字符串。 - 这种方法简单且高效,适用于处理非常大的二进制数。
- Java 提供了
-
时间复杂度:
- 使用
BigInteger进行加法运算的时间复杂度为 (O(n)),其中 (n) 是二进制字符串的长度。这满足题目中关于时间复杂度的要求(不超过 (O(n^2)))。
- 使用
-
步骤:
- 将两个二进制字符串分别转换为
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();
}
}
代码说明
-
方法
solution:- 参数:
binary1:第一个二进制字符串。binary2:第二个二进制字符串。
- 步骤:
- 使用
new BigInteger(binary1, 2)将binary1转换为十进制大整数。 - 同样地,使用
new BigInteger(binary2, 2)将binary2转换为十进制大整数。 - 使用
add方法将两个大整数相加。 - 使用
toString()方法将结果转换为十进制字符串并返回。
- 使用
- 参数:
-
主方法
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 类可以简化大数运算的复杂性,并且能够有效地处理非常大的二进制字符串。这种方法不仅代码简洁,而且性能也足够满足大多数应用场景的需求。