1.二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
考虑一个最朴素的方法:先将 aaa 和 bbb 转化成十进制数,求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算,我们可以很简单地写出这个程序:
class Solution {
public String addBinary(String a, String b) {
return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
}
}
但是会报错
在 Java 中:
如果字符串超过 333333 位,不能转化为 Integer
如果字符串超过 656565 位,不能转化为 Long
如果字符串超过 500000001500000001500000001 位,不能转化为 BigInteger
因此,为了适用于长度较大的字符串计算,我们应该使用更加健壮的算法。
Integer.parseInt(1010, 2):表示输出2进制数1010在10进制下的数。
toBinaryString的方法,作用是:以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式(类似还有toHexSrting()方法和toOctalString()方法)。
解题思路
整体思路是将两个字符串较短的用 000 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。
本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,所以会有 2 种处理方式:
第一种,在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转
第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位
时间复杂度:O(n)O(n)O(n)
class Solution {
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();//StringBuffer线程安全
int ca = 0;//表示进位
for(int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--,j--){
int sum = ca;
sum += i >= 0 ? a.charAt(i) - '0' : 0;
sum += j >= 0 ? b.charAt(j) - '0' : 0;
//'0'的ascll码是48,一个字符转换对应的值,就要减去'0'
ans.append(sum % 2);//StringBuffer的append()方法是拼接
ca = sum / 2;
}
ans.append(ca == 1 ? ca : "");
return ans.reverse().toString();//reverse()表示反转
}
}