解法一:模拟法
这里的模拟法本质上就是通过模拟我们的列竖式的方法,通过末尾对齐,然后逐位相加。
func addBinary(a string, b string) string {
// 最终结果
ans := ""
// 表示上一位的进位
carry := 0
// 获取AB的长度
lenA, lenB := len(a), len(b)
// 获取两个中最大的一个的长度
n := max(lenA, lenB)
for i := 0; i < n; i++ {
// 确保加的数要小于数组的长度
if i < lenA {
// 这里我们使用carry作为这一位的进位计算(carry=carry(上一位)+ai+bi)
carry += int(a[lenA-i-1] - '0')
}
if i < lenB {
// 这个和上面是一样的,如果上面的加完了,那么这一位计算就只会加上bi
carry += int(b[lenB-i-1] - '0')
}
// 这里是计算,相当于把计算的结果都拼接起来
ans = strconv.Itoa(carry%2) + ans
// 这里是计算进位,因为我们是二进制运算,如果carry为1,那么就没有进位,计算的结果为0,否则计算的结果为1
carry /= 2
}
if carry > 0 {
ans = "1" + ans
}
return ans
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
解法二 朴素法
这个方法其实就是先把字符串转换为int类型,然后直接计算,最后再把计算结果转换为二进制的形式,下面这个解法使用Python一行代码即可实现
class Solution:
def addBinary(self, a, b) -> str:
return '{0:b}'.format(int(a, 2) + int(b, 2))