给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
- 每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
- 1 <= a.length, b.length <= 10^4
- 字符串如果不是 “0”,就都不含前导零。
方法一:模拟
思路和算法
这里我们需要理解,实际
中二进制加法,和字符串
中模拟二进制加法的区别,这一点要在大脑里有一个概念.
给出a="1010",b="11"
具体的,我们可以取
n
=
max
{
∣
a
∣
,
∣
b
∣
}
n = \max\{ |a|, |b| \}
n=max{∣a∣,∣b∣},循环 n 次,从最低位开始遍历。我们使用一个变量
c
a
r
r
y
\rm carry
carry表示上一个位置的进位,初始值为 0。记当前位置对其的两个位为
a
i
a_i
ai和
b
i
b_i
bi,则每一位的答案为
(
c
a
r
r
y
+
a
i
+
b
i
)
m
o
d
2
({\rm carry} + a_i + b_i) \bmod{2}
(carry+ai+bi)mod2,下一位的进位为
⌊
c
a
r
r
y
+
a
i
+
b
i
2
⌋
\lfloor \frac{{\rm carry} + a_i + b_i}{2} \rfloor
⌊2carry+ai+bi⌋。重复上述步骤,直到数字 a 和 b 的每一位计算完毕。最后如果
c
a
r
r
y
\rm carry
carry 的最高位不为 0,则将最高位添加到计算结果的末尾。
注意,为了让各个位置对齐,你可以先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。当然你也可以直接把 a 和 b 中短的那一个补 0 直到和长的那个一样长,然后从高位向低位遍历,对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。这里的代码给出第一种的实现。