67. 二进制求和

题目描述

给定两个二进制字符串,两个相加返回结果

输入: a = “1010”, b = “1011”
输出: “10101”

解决方案

将指针指向字符串最后一位,两两相加再加上仅为,注意处理进位,两字符串的当前值为1时
* 当前进位为0时,那么1 + 1 + 0 = 2 ,二进制要进位,当前值应该为2 % 2 = 0。进位变为1
* 当前仅为为1时,那么1 + 1 + 1 = 3 ,二进制要进位,当前值应为 3 % 2 = 1。 进位为1
* 将当前值放到数组头部

i = 0 i = 1 i = 2 i = 3
a数组 1 1 1
b数组 1 0 1
result 1 0 0 0

代码

var addBinary = function(a, b) {
    let aLength = a.length;
    let bLength = b.length;

    let i = aLength - 1;
    let j = bLength - 1;

    let result = [];
    let add = 0; // 进位

    while(i >= 0 || j >= 0) {
        let atemp = i >= 0 ? a[i] * 1 : 0;  // 对i判定大于0为了防止数组溢出
        let btemp = j >= 0 ? b[j] * 1 : 0;

        let current =  atemp + btemp + add;
        if(current >= 2) {
            add = Math.floor(current / 2);
        } else {
            add = 0;
        }
        result.unshift(current % 2); // 将当前值放入到数组头

        i--;
        j--;
    }
    // 退出循环后如果数组为1表示有进位,那也要加到数组头
    if(add != 0) {
        result.unshift(add)
    }

    return result.join("")
};