【leetcode】67. 二进制求和

48 阅读1分钟

leetcode-67.png

这道题思路比较简单,关键在于模拟二进制加法的过程,记录每一位的 进位(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)),用于存储结果。