二进制之和题目解析与代码实现
题目描述
小U和小R希望找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。二进制串可能非常长,需要在时间复杂度不超过O(n^2)的前提下完成任务。
输入格式
输入包含两个二进制字符串 binary1
和 binary2
。
输出格式
输出一个字符串,表示两个二进制字符串相加后的十进制结果。
示例
// 样例1
输入:binary1 = "101" , binary2 = "110"
输出:"11"
// 样例2
输入:binary1 = "111111" , binary2 = "10100"
输出:"83"
// 样例3
输入:binary1 = "111010101001001011" , binary2 = "100010101001"
输出:"242420"
// 样例4
输入:binary1 = "111010101001011" , binary2 = "10010101001"
输出:"31220"
// 样例5
输入:binary1 = "11" , binary2 = "1"
输出:"4"
解决方案
为了实现上述功能,我们可以按照以下步骤进行:
-
初始化:
- 创建一个
StringBuilder
对象用于构建结果字符串。 - 初始化一个变量
carry
表示进位值,初始为0。 - 定义两个指针
i
和j
分别指向两个输入字符串的末尾。
- 创建一个
-
循环处理:
- 使用一个循环,当任一指针未达到字符串开头或仍有进位时继续执行。
- 在每次迭代中,先将当前的进位值
carry
加到sum
中。 - 如果指针
i
或j
指向的位置有效,则读取对应的字符(即二进制位),将其转换为整数后加入sum
中,并相应地移动指针。 - 更新进位值
carry
为sum
整除2的结果,因为二进制数相加时超过1就需要进位。 - 将
sum
对2取模的结果追加到StringBuilder
对象中,这代表了当前位的计算结果。
-
结果处理:
- 循环结束后,由于我们是从最低位开始计算并存储结果的,因此需要反转
StringBuilder
对象得到正确的结果顺序。 - 利用
BigInteger
类将最终的二进制字符串转换成十进制数,并返回其字符串表示形式。
- 循环结束后,由于我们是从最低位开始计算并存储结果的,因此需要反转
代码实现
import java.math.BigInteger;
public class Main {
public static String solution(String binary1, String binary2) {
StringBuilder result = new StringBuilder();
int carry = 0; // 进位
int i = binary1.length() - 1;
int j = binary2.length() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry; // 先将进位加上
if (i >= 0) {
sum += binary1.charAt(i--) - '0'; // 将字符转换为数字
}
if (j >= 0) {
sum += binary2.charAt(j--) - '0'; // 将字符转换为数字
}
carry = sum / 2; // 计算新的进位
result.append(sum % 2); // 结果取余,转换为字符
}
result.reverse(); // 反转结果
BigInteger decimalSum = new BigInteger(result.toString(), 2);
return decimalSum.toString();
}
public static void main(String[] args) {
// 测试样例
System.out.println(solution("101", "110").equals("11"));
System.out.println(solution("111111", "10100").equals("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"));
}
}
学习建议
-
理解基本概念:深入理解二进制数的基本概念及其运算是解决此类问题的基础。可以通过阅读教材或在线资源来巩固这些基础知识。
-
练习编码技巧:实践是提高编程技能的关键。尝试自己动手实现上述算法,如果遇到困难,可以参考提供的代码逐步调试。
-
关注边界情况:在处理字符串操作时,特别注意边界情况,如空字符串、单个字符等,确保程序的健壮性。
-
利用标准库:了解并熟练使用Java标准库中的工具类,如本题中使用的
BigInteger
类,它们能极大简化开发工作,同时提供强大的功能支持。 -
优化算法性能:虽然题目要求的时间复杂度已经给出,但在实际工作中,优化算法性能始终是一个值得追求的目标。思考是否有更高效的方式来解决问题,比如利用位运算等技术。
通过这样的学习和实践,不仅可以加深对二进制运算的理解,还能提升解决实际问题的能力。希望每位读者都能从中学到有用的知识,并应用到未来的项目中。