二进制求和

题目

难度级别:简单

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0。

示例 1:

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

示例 2:

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

提示:

每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。

解题思路

初始思路

这道题刚开始我想直接把二进制转换成十进制,求和之后在把和转化成二进制,但发现计算数字超出。记录错误代码

const addBinary = function(a, b) {
    const len_a = a.length
    const len_b = b.length
    let sums = 0
    let res = ""

    for (let i = len_a - 1; i >= 0; i--) {
        sums +=  a[i] * 2 ** (len_a - 1 -i)  // 这里超出了
    }

    for (let i = len_b - 1; i >= 0; i--) {
        sums +=  b[i] * 2 ** (len_b - 1 -i)
    }

    while(sums > 1) {
        res = sums % 2 + res
        sums =  (sums - sums % 2) / 2
    }

    return sums + res
};

正解

通过二进制得加减进行计算。保存进位carry,倒叙遍历2个字符串,若其中一个字符串遍历完则用0补齐。若若计算完第一位还有进位,则在增加1。最后将结果字符串倒叙。

const addBinary = function(a, b) {
    let carry = 0
    let res = ""

    for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
        let sum = carry
        
        sum += i >= 0 ? parseInt(a[i]) : 0
        sum += j >= 0 ? parseInt(b[j]) : 0
        res += sum % 2
        carry = Math.floor(sum / 2)
    }

    res += carry === 1 ? 1 : ''

    return res.split("").reverse().join("")
};

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容