题目:
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “10”
输出: “101”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
注意:本题与主站 67 题相同:https://leetcode-cn.com/problems/add-binary/
下面是算法的解题流程:
下面是解题步骤的简要概述:
算法流程:
-
创建一个空字符串
result
来保存计算结果。 -
初始化两个指针
i
和j
分别指向字符串a
和字符串b
的末尾。扫描二维码关注公众号,回复: 16149570 查看本文章 -
初始化一个进位变量
carry
,并设置为 0。 -
进入循环,直到两个指针都到达字符串的开头,或者进位变量
carry
大于 0。-
定义一个和变量
sum
并将其初始化为 0。 -
如果指针
i
仍然在字符串a
的有效范围内,那么将a[i]
转换为整数值并加到sum
中。 -
如果指针
j
仍然在字符串b
的有效范围内,那么将b[j]
转换为整数值并加到sum
中。 -
将进位变量
carry
加到sum
中。 -
将和
sum
的余数对应的字符(‘0’ 或 ‘1’)追加到结果字符串result
的末尾。 -
将和
sum
的整除值更新进位变量carry
。 -
将指针
i
和j
向前移动一位。
-
-
循环结束后,将结果字符串
result
反转,使得结果字符串的顺序正确。 -
返回结果字符串
result
。
这个算法的步骤与之前提供的解题步骤一致,只是对代码进行了调整以满足要求。它通过遍历两个字符串的对应位置,依次将每个位置上的数值与进位相加,并更新结果字符串和进位变量。最终得到的结果是两个01字符串的和的二进制表示形式。
程序代码(C++):
string addBinary(string a, string b) {
string result;
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = 0;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
sum += carry;
result.push_back('0' + (sum % 2));
carry = sum / 2;
}
reverse(result.begin(), result.end());
return result;
}
这个算法的时间复杂度和空间复杂度如下:
时间复杂度分析:
- 设字符串 a 的长度为 n,字符串 b 的长度为 m。
- 在循环中,需要遍历字符串 a 和字符串 b 的所有字符,因此时间复杂度为 O(n + m)。
- 反转结果字符串的操作需要花费 O(n + m) 的时间复杂度。
- 综合起来,算法的总体时间复杂度为 O(n + m)。
空间复杂度分析:
- 空间复杂度主要取决于结果字符串的长度,即最终的二进制和的位数。
- 结果字符串的最大长度为 max(n, m) + 1,因为可能存在进位导致结果长度增加 1。
- 因此,算法的空间复杂度为 O(max(n, m))。
综上所述,这个算法的时间复杂度为 O(n + m),空间复杂度为 O(max(n, m))。其中 n 和 m 分别是输入字符串 a 和 b 的长度。
编程代码(Python):
def addBinary(a: str, b: str) -> str:
result = []
i, j = len(a) - 1, len(b) - 1
carry = 0
while i >= 0 or j >= 0 or carry > 0:
sum = carry
if i >= 0:
sum += int(a[i])
i -= 1
if j >= 0:
sum += int(b[j])
j -= 1
result.append(str(sum % 2))
carry = sum // 2
return ''.join(result[::-1])