开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
一、题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 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)
}
范文参考: