美文网首页
javascript-字节跳动,腾讯大厂面试专题——力扣(67)

javascript-字节跳动,腾讯大厂面试专题——力扣(67)

作者: 纯粹的少年 | 来源:发表于2020-09-16 08:02 被阅读0次

题目

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"

解题思路

  • 错误的思考
    • 首先我们想到的是转换成数字,然后做加法,最后以2进制返回。但是这样的思考方式不正确,因为超过了数字的最大长度
  • 正确的思路
    • 首先我们不管传入的是什么,我们都让第一个是长的哪个。
    • 之后我们把这两个字符串转换成只有一个数字的数组
    • 我们取出两个数组的长度差取出来。
    • 遍历短的数组,把对应的位置加入到长数组中。
    • 之后利用while循环,讲数组中出现二的时候全部进位。
    • 最后我们返回这个数组转换成的字符串。

代码

  • 话不多说,我们上代码。
var addBinary = function (a, b) {
    // 始终让第一项的长度大于第二项
    if (a.length < b.length) [a, b] = [b, a];
    // 把传入的字符串改成数组在转换成数字,避免直接转换成数字后长度溢出
    a = a.split("").map(Number);
    b = b.split("").map(Number);
    // 来计算两个数组长度的差,下面遍历时使用
    let difference = a.length - b.length;
    for (let i = 0; i < b.length; i++) {
        // 遍历从后面相加每一项
        a[difference + i] = b[i] + a[difference + i]
    }
    // 这里利用while循环把每个2都向前进位。
    while (a.indexOf(2) !== -1) {
        let current = a.indexOf(2);
        a[current] = 0;
        if (current === 0) {
            a.unshift(1);
            continue;
        }
        a[current - 1] += 1; 
    }
    // 返回数组转换成字符串之后 
    return a.join("")
};

相关文章

网友评论

      本文标题:javascript-字节跳动,腾讯大厂面试专题——力扣(67)

      本文链接:https://www.haomeiwen.com/subject/mjocyktx.html