这道题思路比较简单,关键在于模拟二进制加法的过程,记录每一位的 进位(carry) 并处理即可。
我们可以从字符串的末尾开始,从低位逐位相加。每一轮使用一个变量 sum 记录当前位的计算结果:
- 把当前两个二进制位(如果存在)转换为数字并累加到
sum; - 加上上一次的进位
carry; - 当前位的结果就是
sum % 2; - 更新进位:
carry = Math.floor(sum / 2); - 最后把结果数组反转后拼接成字符串即可。
var addBinary = function (a, b) {
let i = a.length - 1,
j = b.length - 1;
let carry = 0;
let res = [];
while (i >= 0 || j >= 0 || carry) {
// sum 累加来记录剩余部分以及进位
let sum = carry;
// 把字符 '0'/'1' 转换为数字 0/1
if (i >= 0) sum += +a[i--];
if (j >= 0) sum += +b[j--];
// 当前位
res.push(sum % 2);
// 进位
carry = Math.floor(sum / 2);
}
return res.reverse().join("");
};
-
时间复杂度:O(max(m, n)),其中 m 和 n 是两个字符串的长度。
-
空间复杂度:O(max(m, n)),用于存储结果。