题目:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
解析:
- 当前位相加的结果为相加的数%2,进位标志则是/2;
- 需要有一个进位标志位记录上一步的进位情况,并将进位情况带入下一位的计算中;
- 从后向前计算到第一位后若最终进位标志变量仍然为1, 则需要再加一位;
- 使用StringBuilder类记录结果并反向转化为字符串输出。
代码:
public String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
int al = a.length() - 1;
int bl = b.length() - 1;
int carry = 0; // carry记录进位的情况
while (al >= 0 || bl >= 0) {
// 每次计算前都将sum(单位求和结果)的值记做进位标志的carry值
// 若carry为0,则表示上次没有产生进位,若为1,则表示上次有进位
int sum = carry;
if (al >= 0) {
sum += (a.charAt(al) - '0'); // sum求加上a中当前位的值,若为0,则之间就剪掉不加了
al--;
}
if (bl >= 0) {
sum += (b.charAt(bl) - '0');
bl--;
}
// 当前位相加再%2则为结果,进位则/2
result.append(sum%2);
carry = sum/2;
}
// 加到最后若还有进位,还需要再次添加一次
if (carry != 0) result.append(1);
// 将结果反向并转化为String类型输出
return result.reverse().toString();
}