第二题:二进制加法

题目:

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Logisim是一款数字电路模拟软件,可以用来设计和模拟各种逻辑电路。八位二进制加法器在计算机中扮演着非常重要的角色,它可以将两个八位二进制数相加,并产生一个八位二进制结果。 在Logisim中,我们可以通过组合逻辑电路来实现八位二进制加法器。首先,我们需要为每一位二进制数准备输入引脚,并连接到相应的开关或输入按钮上。然后,我们可以使用逻辑门(如XOR门、AND门等)来进行每一位的相加运算。 具体来说,我们可以使用八个全加器来实现八位二进制数的相加。每个全加器有三个输入和两个输出。前两个输入分别对应两个要相加的二进制数的对应位,第三个输入为进位标志。输出分为两部分,一部分是当前位的计算结果,另一部分是进位标志。 将每个全加器按照顺序连接起来,将前一个全加器的进位标志与后一个全加器的进位标志相连。最后,我们需要将每一位的计算结果和进位标志输出到相应的显示器或输出按钮上,以便观察结果。 通过这样的设计,我们就可以在Logisim中实现一个八位二进制加法器。只需提供两个八位二进制数作为输入,然后观察输出结果。这个加法器可以用于计算机中的各种二进制数相加运算,如整数加法、浮点数加法等。 总之,Logisim是一个非常强大的数字电路模拟软件,可以帮助我们设计和模拟各种逻辑电路。通过组合逻辑电路的设计,我们可以在Logisim中实现八位二进制加法器,用于计算机中的二进制数相加运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaoqiangliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值