刷题日记 67. 二进制求和

124 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

一、题目描述:

67. 二进制求和 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

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

示例 2:

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

提示:

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

二、思路分析:

思路:

两数相加都是从末位开始,对应位数改变且产生进位。两个二进制数字相加,从它们的末位开始遍历,若对应位数都是0,则依然是0,进位为0;若一个是0,一个是1,则变成1,进位为0;若两个都是1,则变为0,进位为1;若两个都是1,且进位为1,则变为0,进位为1;

因为二进制只有0,1,根据以上规律,容易联想到异或运算,即两数相同异或为0,0与任意数字异或为数字本身;所以相加的位数为 a[i] ^ b[j] ^ add;初始化进位add = 0,若 a[i] b[i] add 中有两个及两个以上数字为1,则add为1

遍历数组后,已更改全部位数,若此时进位为1,则需在首部添加1

三、AC 代码:

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
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('')
};

范文参考

一行代码,思路简单,性能接近100%

「手画图解」位运算、逐位相加、二者结合

大数相加的思想,二进制前面不足的位用0补齐以保证对齐