题目介绍:
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
解题关键:
1, 位相加,处理进位
3, 将二进制字符串倒序
2, 最后重新翻转数字得到结果
这里讲下golang里的字符串转化成数字的技巧:'1' - '0', 注意看是单引号,不是双引号,以上表达式得到的是数字类型,对应uint32类型
如下是完整代码
package binarys
import (
"fmt"
"strings"
"testing"
)
// addBinary 函数接受两个二进制字符串,返回它们的和(也是二进制字符串)
func addBinary(a string, b string) string {
// 将字符串反转,便于从低位开始相加
a = reverseString(a)
b = reverseString(b)
// 初始化结果字符串和进位
var result strings.Builder
carry := 0
// 遍历两个字符串的每一位
i, j := 0, 0
for i < len(a) || j < len(b) || carry > 0 {
// 获取当前位的值,如果索引超出字符串长度,则默认为 0
digitA := 0
if i < len(a) {
digitA = int(a[i] - '0')
i++
}
digitB := 0
if j < len(b) {
digitB = int(b[j] - '0')
j++
}
// 计算当前位的和以及进位
sum := digitA + digitB + carry
result.WriteByte(byte(sum%2 + '0'))
carry = sum / 2
}
// 反转结果字符串并转换为字符串类型返回
return reverseString(result.String())
}
// reverseString 函数反转字符串
func reverseString(s string) string {
runes := []rune(s)
i, j := 0, len(runes)-1
for i < j {
runes[i], runes[j] = runes[j], runes[i]
i++
j--
}
return string(runes)
}
func TestBinarySum(t *testing.T) {
a := "11"
b := "1"
fmt.Println(addBinary(a, b)) // 输出: "100"
a = "1010"
b = "1011"
fmt.Println(addBinary(a, b)) // 输出: "10101"
}