题目描述
给定两个二进制字符串,返回他们的和(用二进制表示)
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
思路
将字符串转化为int数组,数组的长度为两个字符串最长长度+1(长度+1的原因是考虑到最高位进位的情况),然后将a,b字符串对应的数组按右对齐进行赋值,如“111”和“1”赋值为[0,1,1,1]和[0,0,1,1],然后从后向前逐位进行相加,满2进位。最后,将得到的结果转化为字符串。注意去掉结果前面的0,如果结果全为0,则返回字符串 “0”。注意: a b 字符串中全为0情况,这种情况下 结果为全为0,返回的数组为0。
代码
class Solution {
/**
* 将字符串转化为int数组,数组的长度为两个字符串最长长度+1(长度+1的原因是考虑到最高位进位的情况),然后将a,b字符串对应的数组
* 按右对齐进行赋值,如“111”和“1”赋值为[0,1,1,1]和[0,0,1,1],然后从后向前逐位进行相加,满2进位。
* 最后,将得到的结果转化为字符串。注意去掉结果前面的0,如果结果全为0,则返回字符串 "0"。
* 注意: a b 字符串中全为0情况,这种情况下 结果为全为0,返回的数组为0。
*/
public String addBinary(String a, String b) {
char[] a2char = a.toCharArray();
char[] b2char = b.toCharArray();
StringBuilder sb = new StringBuilder();
//得到int数组最大的长度,用于后续的循环,多加一位用于进位的情况
int maxLength = a.length() < b.length() ? b.length() : a.length() + 1;
int maxArrayLength = maxLength + 1;
int[] a2int = new int[maxArrayLength];
int[] b2int = new int[maxArrayLength];
//将字符串a转化为int数组
for(int i = a.length() - 1; i >= 0; -- i){
if(a2char[i] == '1'){
a2int[-- maxArrayLength] = 1;
}else if(a2char[i] == '0'){
a2int[-- maxArrayLength] = 0;
}
}
maxArrayLength = maxLength + 1;
//将字符串b转化为int数组
for(int i = b.length() - 1; i >= 0; -- i){
if(b2char[i] == '1'){
b2int[-- maxArrayLength] = 1;
}else if(b2char[i] == '0'){
b2int[-- maxArrayLength] = 0;
}
}
maxArrayLength = maxLength + 1;
//两数组相加
for(int i = maxArrayLength - 1; i >= 0; -- i){
if((a2int[i] + b2int[i]) > 1){
int carry = (a2int[i] + b2int[i]) / 2;
int remainder = (a2int[i] + b2int[i]) % 2;
a2int[i] = remainder;
if(carry > 0){
a2int[i - 1] += carry;
}
}else{
a2int[i] += b2int[i];
}
}
//去掉计算结果中左边的0
int start = a2int.length;
for(int i = 0; i < a2int.length; ++ i){
if(a2int[i] == 0){
continue;
}else{
start = i;
break;
}
}
//将计算结果转换为字符串
if(start == a2int.length){
sb.append(0);
}else{
for(int i = start; i < a2int.length; ++ i){
sb.append(a2int[i]);
}
}
return sb.toString();
}
}