原题地址:https://leetcode.cn/problems/JFETK5/
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1 和 0。
模拟进位,末尾对其,逐位相加
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
// 如果ab的长度不等,取更长的作为数组长度
int n = Math.max(a.length(), b.length()), carry = 0;
for (int i = 0; i < n; ++i) {
// (补0)如果i>字符串的长度,则表示这个字符串已经被遍历完成,可以将这一位当做0
// 遍历a
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
// 遍历b
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
// carry可能出现加了进位以后大于2的情况,所以对结果进行取余
ans.append((char) (carry % 2 + '0'));
// carry更新,eg:carry=2,更新后为0,carry=3,更新后为1;
carry /= 2;
}
// 遍历完成还存在进位
if (carry > 0) ans.append('1');
return ans.reverse().toString();
}
主要的思想是模拟二进制竖式相加的方法,补0可以处理字符串长度不等的情况。