【JS每日一算法】🟩61.二进制求和(双指针)

184 阅读2分钟

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零

示例:

输入: a = "11", b = "1"
输出: "100"

题解:

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 双指针   TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} a 给二进制字符串1
 * @param {*} b 给二进制字符串2
 * @return {*}
 */
function doublePoints(a,b){
    /**
     * 该方案利用双指针的方式,定义两个指针分别指向a,b两数组最后一个
     * 元素,定义一个变量记录其是否有进位情况,然后从后向前遍历两数组
     * 元素,将两元素值(如果存在)与进位变量相加,当前位置的结果则等于
     * 相加后的和对2取余,是否存在进位则等于相加后的和除以2然后向下取
     * 整。当两指针都超出了数组索引范围此时结束循环。最后再判断是否存
     * 在进位,有则在结果前加一个'1'。
     */

    // 定义两指针
    let point1=a.length-1,
    point2=b.length-1,
    // 是否存在进位
    carry=0,
    // 结果
    out='';
    // 从后到前遍历两数组元素,当两指针都超出了数组索引结束循环
    while(a[point1]||b[point2]){
        // 将两元素值(如果存在)与进位变量相加
        if(a[point1])carry+=a[point1]*1;
        if(b[point2])carry+=b[point2]*1;
        // 当前位置的结果则等于相加后的和对2取余
        out=carry%2+out;
        // 否存在进位则等于相加后的和除以2然后向下取整
        carry=Math.floor(carry/2);
        point1--;
        point2--;
    }
    // 最后如果还存在进位,则需要在结果前加一个'1'。
    if(carry!=0)out='1'+out;
    // 返回结果
    return out;
}

来源:力扣(LeetCode)