美文网首页
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