leetcode-67. 二进制求和

题目描述

给你两个二进制字符串 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);
};

posted @ 2022-11-02 19:04  含若飞  阅读(29)  评论(0编辑  收藏  举报