题目描述
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
提示:
- 1 <= a.length, b.length <= 104
a
和b
仅由字符'0'
或'1'
组成- 字符串如果不是
"0"
,就不含前导零
解题方法
模拟
这道题和第66题相似。按照二进制的规则模拟加法,从低位开始,两个二进制数低位相加超过2后,向高位进1,该位的值取模余2后的值,然后高位相加再加进位,依次类推往后遍历;若遍历的过程中有一个二进制数已经遍历完,则只需要将没遍历完的二进制数和进位相加,直到遍历到末尾。此时若还有进位1,则结果补充一个高位1。
java代码
public String addBinary(String a, String b) {
List<Integer> list = new ArrayList<>();
// 把位数多的二进制数赋值给a,位数小的二进制数赋值给b,方便后续运算
if (a.length() < b.length()) {
String str = a;
a = b;
b = str;
}
int maxLength = a.length();
int minLength = b.length();
char c = '0';
// 进位
int add = 0;
for (int i = 0; i < maxLength; i++) {
int num1 = a.charAt(a.length() - 1 - i) - c;
// i < minLength时,a和b相加再加进位
if (i < minLength) {
int num2 = b.charAt(b.length() - 1 - i) - c;
int sum = num1 + num2 + add;
add = sum / 2;
list.add(sum % 2);
} else {
int sum = num1 + add;
add = sum / 2;
list.add(sum % 2);
}
}
// add = 1时,需要加一个高位1
if (add == 1) {
list.add(add);
}
StringBuilder result = new StringBuilder();
for (int i = list.size() - 1; i >= 0; i--) {
result.append((char) (list.get(i) + (int) c));
}
return result.toString();
}
复杂度分析
时间复杂度:
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)),
m
m
m和
n
n
n分别为两个二进制字符串的长度,二进制相加的过程中需要遍历完两个字符串。
空间复杂度:
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)),需要留出空间存储运算后的结果,运算后的结果接近
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n))级别的存储空间。
相似题目
- 个人公众号
- 个人小游戏