题目描述

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

示例

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

思路分析

我们可以先将其转化为整数,相加之后再转为二进制,但是这样的处理方式不能过掉全部样例。字符串的长度可能非常长,int类型会超出限制,因此如果使用js时可以考虑转化为bigInt类型的,再进行相加。
另一种方法,也就是遍历字符串的每一项,对进位进行处理,这种方法是比较使用大多数相加类型案例的。
对于相加,我们可以使用位运算符,关于位运算符的使用我们可以参考下图:
image

image

参考代码

//方法一:
var addBinary = function(a, b) {
    let result = []
    let curry = 0
   
    let len = Math.max(a.length,b.length)
    a = a.padStart(len,'0')
    b = b.padStart(len,'0')
    for(let i = len -1; i>= 0; i --) {
        let aAt = a.charAt(i)===''?0 :Number(a.charAt(i))
        let bAt = b.charAt(i)===''?0:Number(b.charAt(i))
        let tmp = aAt + bAt + curry
        if(tmp == 3 || tmp == 2) {
            curry = 1
            tmp == 3 ? result.unshift(1) : result.unshift(0)
        }else if(tmp == 1 || tmp == 0) {
            curry = 0
            tmp == 1 ? result.unshift(1) :result.unshift(0)
        }
    }
    if(curry==1) result.unshift(1)
    return result.join('')
};
//方法二:
var addBinary = function(a, b) {
    let add = 0
    let sum = []
    for(let i = a.length -1, j = b.length -1; i >= 0 || j >= 0; i--, j--) {
        let num1 = +a[i] || 0
        let num2 = +b[j] || 0
        sum.unshift(num1 ^ num2 ^ add)
        add = num1 + num2 + add > 1 ? 1 : 0
        
    }
    if (add === 1) sum.unshift(1)
    return sum.join('')
};

//方法三:
function addBinary(a: string, b: string): string {
    let add = 0;
    let sum = [];

    for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
        // 位数不够,默认为 0
        let num1 = +a[i] || 0;
        let num2 = +b[j] || 0;

        // 两数相同异或为0,0与任意数字异或为数字本身
        sum.unshift(num1 ^ num2 ^ add);
        add = num1 + num2 + add > 1 ? 1 : 0;
    }

    if (add === 1) sum.unshift(1);

    return sum.join('');
};

//方法四:
//转化位bigint类型
var addBinary = function(a, b) {
    var a = '0b' + a;
    var b = '0b' + b;
    var sum = BigInt(a) + BigInt(b);
    return sum.toString(2);
};

原文地址:http://www.cnblogs.com/zx529/p/16852064.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性