给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
思路:二进制求和
1.统一两个字符串长度,长度短的补0
2.从最后一位开始,倒序遍历,分情况讨论
2.1定义一个字符,表示是否需要进位
2.2如果两个都是1或者两个都是0,则累加后当前位总是0,并且两个都是1时需要进位1
2.3如果两个为一个1一个0,则累加后当前位总是1
3.判断最后一个字符是否进位,进位则再添加一个1
4.之前添加的元素为倒序,反转字符串
public class addbinary {
public String addBinary(String a, String b) {
//这段代码是将将两个字符串长度统一
int alength = a.length()-1;
int blength = b.length()-1;
StringBuilder stringBuilder = new StringBuilder();
//如果一个字符串长度小,将缺失的部分用0补齐,例如1和111补齐为001和111
if (alength < blength){
for (int i = 0; i < blength - alength; i++){
stringBuilder.append("0");
}
stringBuilder.append(a);
//将补齐后的字符串重新赋值给该字符串
a = stringBuilder.toString();
//两者统一长度
alength = blength;
}else {
for (int i = 0; i < alength - blength; i++){
stringBuilder.append("0");
}
stringBuilder.append(b);
b = stringBuilder.toString();
blength = alength;
}
StringBuilder result = new StringBuilder();
//c用来记录是否需要进位
char c = 0;
while(alength >= 0 && blength >= 0){
//两者均为1或者或者均为0
if (a.charAt(alength) == b.charAt(blength)){
//如果有进位
if (c == '1'){
result.append('1');
//消除进位
c = '0';
}else {
//如果两个都是1,则当前位是0,进位1;如果两个都是0,则当前位是0,无进位
result.append('0');
}
//如果两个都是1
if (a.charAt(alength) == '1'){
//下一个字符需要进位
c = '1';
}
}else { //0+1的情况
//判断是否需要进位
if (c == '1'){
result.append('0');
}else {
//0+1的情况当前位永远都是1
result.append('1');
}
}
alength--;
blength--;
}
//判断最后一个字符是否进位,进位则再添加一个1
if (c == '1'){
result.append('1');
}
StringBuilder ans = new StringBuilder();
//result为逆序,需要反转字符串
for (int i = result.length()-1; i >= 0; i--) {
ans.append(result.charAt(i));
}
return ans.toString();
}
}



