第二题:二进制加法

题目:

给定两个 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/

下面是算法的解题流程:

下面是解题步骤的简要概述:
在这里插入图片描述

算法流程:

  1. 创建一个空字符串 result 来保存计算结果。

  2. 初始化两个指针 ij 分别指向字符串 a 和字符串 b 的末尾。

  3. 初始化一个进位变量 carry,并设置为 0。

  4. 进入循环,直到两个指针都到达字符串的开头,或者进位变量 carry 大于 0。

    • 定义一个和变量 sum 并将其初始化为 0。

    • 如果指针 i 仍然在字符串 a 的有效范围内,那么将 a[i] 转换为整数值并加到 sum 中。

    • 如果指针 j 仍然在字符串 b 的有效范围内,那么将 b[j] 转换为整数值并加到 sum 中。

    • 将进位变量 carry 加到 sum 中。

    • 将和 sum 的余数对应的字符(‘0’ 或 ‘1’)追加到结果字符串 result 的末尾。

    • 将和 sum 的整除值更新进位变量 carry

    • 将指针 ij 向前移动一位。

  5. 循环结束后,将结果字符串 result 反转,使得结果字符串的顺序正确。

  6. 返回结果字符串 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])

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/congcong0509/article/details/131384042
今日推荐