算法笔记 -- 67. 二进制求和

92 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

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

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

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

示例 1:

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

示例 2:

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

提示:

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

二、思路分析:

这个只要会我们小时候刚学加法的时候那种解法就简单多了。

首先不能将二进制字符串直接转换成整数,然后将转好的整数相加后再转成二进制字符串,因为这种解法可能会导致溢出。

在做十进制加法时,总是将两个数字的右端对齐,然后从它们的个位开始从右向左相加同一位置的两个数位,如果前一位有进位还有加上进位。

我们的题解也是从字符串的右端出发向左做加法,唯一和十进制加法不同的是,二进制是逢二进一,也就是说当两个数位加起来等于2就会产生进位。

三、AC 代码:

func addBinary(a string, b string) string {
    na := len(a)
    nb := len(b)
    ia, ib := na, nb
    result := []byte{}
    carry := false
    for ia >0 || ib > 0 {
        ia--
        ib--
        sum := 0
        if carry {
            sum += 1
            carry = false
        }
        
        if ia >=0 {
            sum += int(a[ia] - '0')
        }
        if ib >= 0 {
            sum += int(b[ib] - '0')
        }
        carry = sum > 1
        sum %= 2
       
        result = append([]byte{byte(sum+'0')}, result...)
        
    }
   
    if carry {
        result = append([]byte{'1'}, result...)
    }
    return string(result)
}

范文参考

67. 二进制求和 题解 - 力扣(LeetCode)

画解算法:67. 二进制求和 - 二进制求和 - 力扣(LeetCode) (leetcode-cn.com)

跟十进制加法原理一模一样,代码简洁,注释详细 - 二进制求和 - 力扣(LeetCode)