55.二进制之和 | 豆包MarsCode AI刷题

50 阅读2分钟

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。


测试样例

样例1:

输入:binary1 = "101" ,binary2 = "110"
输出:'11'

样例2:

输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'

样例3:

输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'

样例4:

输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'

样例5:

输入:binary1 = "11" ,binary2 = "1"
输出:'4'

这道题本质上是考察做一个二进制加法,最后把结果转化成十进制。 二进制的加法与十进制加法类似,从个位开始,逐位向高位加。每次加法可能产生一个进位,需要一个标志位进行特殊处理。

  1. 从低位开始加:从二进制字符串的最右边开始逐位进行加法。也就是在模拟普通加法从个位开始的方式。
  2. 处理不同长度的字符串:如果两个字符串的长度不同,将较短的字符串的高位补齐0
  3. 进位处理:每次加法后,要判断是否有进位。比如,1 + 1 会变成 0,并且进位到更高的一位。
  4. 最终的结果是十进制:加完之后,得到的是一个二进制字符串,还需要把它转换成十进制返回。

解法

  1. 初始化:首先,我们需要一个(进位)变量来保存每一位的进位,初始值是 0。还需要一个结果列表来存储每一位的加法结果。
  2. 逐位加法:从两个字符串的末尾开始,逐位相加。如果某一位有进位,就加上进位。
  3. 处理进位:如果加完所有位数后还有进位,要在最后加上 1。

时间复杂度

  1. 时间复杂度

从头到尾遍历一遍即可,所以时间复杂度为字符串长度O(n)

  1. 空间复杂度

    • 需要一个 result 列表来存储加法结果,最多存储 n 个二进制位,因此空间复杂度是 O(n)。