67. 二进制求和 简单

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

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

示例 1:

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

示例 2:

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

提示:

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

代码参考:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(addBinary("11", "1"))
    fmt.Println(addBinary("1010", "1011"))
}

// 考虑溢出 ok? 不是 strconv.ParseInt(a, 2, 64) 然后相加就能搞定的...
// 任意进制的任意长度数字相加,需从前向后遍历,求和后取余,并考虑进位
func addBinary(a string, b string) string {
    i1, i2 := len(a)-1, len(b)-1
    res := ""
    carry := 0
    for i1 >= 0 || i2 >= 0 {
        sum := carry
        if i1 >= 0 {
            sum += int(rune(a[i1]) - '0') // '0' == 49 // ASCII
            i1--
        }
        if i2 >= 0 {
            sum += int(rune(b[i2]) - '0')
            i2--
        }

        carry = sum / 2
        sum = sum % 2
        if sum == 0 {
            res += "0"
        } else {
            res += "1"
        }
    }

    if carry > 0 {
        res += "1"
    }

    return reverseStr(res)
}

func reverseStr(s string) string {
    runes := []rune(s)
    n := len(runes)
    mid := n / 2
    for i := 0; i < mid; i++ {
        runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
    }
    return string(runes)
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng