一道面试题 67. 二进制求和

67. 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 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 直到和长的那个一样长,然后从高位向低位遍历,对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。这里的代码给出第一种的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

以码平川

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

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

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

打赏作者

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

抵扣说明:

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

余额充值