前端算法(47)

40 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

输入: a = "1010", b = "1011"
输出: "10101"

题目解析

思路一

取长字符串的长度,将短字符串用0往前填充补齐长度,方便后面遍历数值相加,用一个长度一样项初始都为0的数组去存储遍历中相加的数值,并做进位处理,注意最后的进位

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
    let len = 0
    if (a.length > b.length) {
        len = a.length
        b = b.padStart(len, 0)
    } else {
        len = b.length
        a = a.padStart(len, 0)
    }
    let arr = new Array(len).fill(0)
    for (let i = len - 1; i >= 0; i--) {
        let sum = a[i] - 0 + (b[i] - 0)
        arr[i] += sum
        if (arr[i] > 1) {
          arr[i] = arr[i] - 2
          if (typeof arr[i - 1] !== 'undefined') {
            arr[i - 1] = 1
          } else {
            arr.unshift(1)
            break
          }
        }
    }
    return arr.join('')
};

思路二

这里使用循环,先找到较短字符串的长度,以他为循环条件,从末尾开始循环相加,存到一个新的数组,加完之后再将唱的字符串拼接到新数组中,最后循环判断。

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    const num1 = a.split('');
    const num2 = b.split('');
    const num3 = [];
    const minLength = Math.min(num1.length, num2.length);

    if (minLength === num1.length) {
        for (let i = minLength - 1; i >= 0; i--) {
            num3.unshift(Number(num1[i]) + Number(num2[num2.length + i - minLength]));
        }
        for (let j = num2.length - minLength - 1; j >= 0; j--) {
            num3.unshift(Number(num2[j]));
        }
    } else {
        for (let i = minLength - 1; i >= 0; i--) {
            num3.unshift(Number(num2[i]) + Number(num1[num1.length + i - minLength]));
        }
        for (let j = num1.length - minLength - 1; j >= 0; j--) {
            num3.unshift(Number(num1[j]));
        }
    }
    for (let i = num3.length - 1; i >= 0; i--) {
        if (num3[i] > 1 && i != 0) {
            num3[i] = num3[i] % 2;
            num3[i - 1]++;
        } else if (num3[i] > 1 && i == 0) {
            num3[i] = num3[i] % 2;
            num3.unshift(1);
        } else {
            continue;
        }
    }
    return num3.join('');
};

思路三

先声明最大长度,然后对数字进行补零,最后转换为数组,在声明一个变量进行进位,进行循环,如果相加为3则进1,当前位为1,如果相加为2则进1,当前位为0,相加为1或0则不进位,当前位为三个值的和,循环完之后,进位为1的则首位进行补1

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
   let len = Math.max(a.length,b.length)
    a = a.padStart(len,0) 
    b = b.padStart(len,0) 
    let arr1 = a.split('').map((el)=>Number(el)) 
    let arr2 = b.split('').map((el)=>Number(el)) 
    let jin = 0 
    let res = []
    for(let i=len-1;i>=0;i--){
        if(arr1[i]+arr2[i]+jin>2){
            res.unshift(1)
            jin=1
        }else if(arr1[i]+arr2[i]+jin>1){ 
            res.unshift(0)
            jin=1
        }else { 
            res.unshift(arr1[i]+arr2[i]+jin)
            jin=0
        }
    }
    if(jin>0)res.unshift(1)  
    return res.join('')
};