题目
(2)给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
解法1 使用Java内置的BigInteger类
Java中的BigInteger类提供了大整数的运算功能,包括加法。我们可以先将二进制字符串转换为BigInteger对象,然后进行加法运算,最后再将结果转换回二进制字符串
import java.math.BigInteger;
public class BinaryAdditionWithBigInteger {
public static String addBinary(String a, String b) {
BigInteger bigA = new BigInteger(a, 2); // 第二个参数2表示二进制
BigInteger bigB = new BigInteger(b, 2);
BigInteger sum = bigA.add(bigB);
return sum.toString(2); // 转换为二进制字符串
}
public static void main(String[] args) {
String a = "11";
String b = "1";
System.out.println(addBinary(a, b)); // 输出: 100
a = "1010";
b = "1011";
System.out.println(addBinary(a, b)); // 输出: 10101
}
}
解法2 模拟手算二进制加法的过程。
从字符串的末尾(最低位)开始,逐位相加,并处理进位
public class BinaryAddition {
public static String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
int carry = 0; // 进位初始化为0
int i = a.length() - 1;
int j = b.length() - 1;
// 从最低位开始逐位相加,直到两个字符串都遍历完
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry; // 初始化sum为进位值
if (i >= 0) {
sum += a.charAt(i--) - '0'; // 将a的当前位转换为数字并加到sum中
}
if (j >= 0) {
sum += b.charAt(j--) - '0'; // 将b的当前位转换为数字并加到sum中
}
result.append(sum % 2); // 将sum的个位数添加到结果中
carry = sum / 2; // 更新进位值
}
// 反转结果字符串,因为我们是从最低位开始添加的
return result.reverse().toString();
}
public static void main(String[] args) {
String a = "11";
String b = "1";
System.out.println(addBinary(a, b)); // 输出: 100
a = "1010";
b = "1011";
System.out.println(addBinary(a, b)); // 输出: 10101
}
}
这个方法首先创建了一个StringBuilder对象来构建结果字符串。然后,它使用两个指针i和j分别指向字符串a和b的末尾,并初始化进位carry为0。在循环中,它计算当前位的和(包括进位),然后将和的个位数添加到结果字符串中,并更新进位值。循环继续直到两个字符串都遍历完,并且没有剩余的进位。最后,它返回反转后的结果字符串,因为我们是从最低位开始构建的