一、 二进制之和问题
问题描述
小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'
二、解题思路
我们的目标是将两个二进制字符串相加并以十进制形式输出结果。为了避免处理大数时常规方法的局限性,我们可以先将二进制字符串按位相加得到一个新的二进制结果,然后再将这个二进制结果转换为十进制数。
具体步骤
-
二进制加法:
- 首先,我们需要对两个二进制字符串进行逐位相加操作。从两个二进制字符串的最低位(最右边的位)开始,依次向前处理每一位。
- 我们可以使用一个变量来记录进位情况,初始化为 0。当两个当前位的数字相加(再加上进位)的结果大于等于 2 时,就会产生进位,此时需要更新进位变量的值,并将当前位的结果对 2 取余作为这一位相加的实际结果。
- 持续这个过程,直到处理完两个二进制字符串的所有位。如果其中一个二进制字符串已经处理完,而另一个还有剩余的位,我们就继续处理剩余的位,并将其与进位相加(如果有进位的话)。
-
二进制转十进制:
- 完成二进制加法后,我们得到了一个新的二进制字符串作为相加的结果。接下来,要将这个二进制字符串转换为十进制数。
- 从二进制字符串的最低位开始,每一位乘以 2 的相应幂次(幂次从 0 开始,随着位的升高而递增),然后将所有这些乘积相加,就得到了对应的十进制数。
示例演示
以样例 1 为例,输入 binary1 = "101" ,binary2 = "110":
-
二进制加法:
- 从最低位开始,
101的最低位是 1,110的最低位是 0,进位初始为 0。那么这一位相加的结果是1 + 0 + 0 = 1,进位依然为 0。 - 接着处理下一位,
101的第二位是 0,110的第二位是 1,此时相加结果为0 + 1 + 0 = 1,进位还是 0。 - 最后处理最高位,
101的最高位是 1,110的最高位是 1,相加结果为1 + 1 + 0 = 10,这里产生了进位,我们将当前位结果对 2 取余得到 0 作为这一位的实际结果,进位更新为 1。 - 由于两个二进制字符串都已经处理完,但还有进位 1,所以最终得到的二进制结果是
1011。
- 从最低位开始,
-
二进制转十进制:
- 对于二进制字符串
1011,最低位是 1,乘以2^0 = 1;第二位是 1,乘以2^1 = 2;第三位是 0,乘以2^2 = 4;最高位是 1,乘以2^3 = 8。 - 将这些乘积相加:
1×1 + 1×2 + 0×4 + 1×8 = 1 + 2 + 0 + 8 = 11,这就是最终以十进制形式输出的结果。
- 对于二进制字符串
三、solution函数
def solution(binary1, binary2):
# 将二进制字符串转换为整数,然后相加
decimal1 = int(binary1, 2)
decimal2 = int(binary2, 2)
decimal_sum = decimal1 + decimal2
# 返回相加后的十进制结果
return str(decimal_sum)
四、时间和空间复杂度分析
时间复杂度
-
将二进制转换为十进制(
int(binary1, 2)和int(binary2, 2)) :- 对于将二进制字符串转换为十进制整数的操作,Python 的
int()函数在底层实现时,需要遍历二进制字符串的每一位来进行转换计算。假设二进制字符串binary1的长度为 ,二进制字符串binary2的长度为 ,那么这两步操作各自的时间复杂度都是 。因为要完整遍历较长的那个二进制字符串的每一位来完成转换。
- 对于将二进制字符串转换为十进制整数的操作,Python 的
-
十进制数相加(
decimal1 + decimal2) :- 在 Python 中,整数相加的时间复杂度通常是常数时间 ,这是因为 Python 会对整数进行优化处理,对于常规大小的整数,相加操作能够在很短的、近似于常数的时间内完成。但当整数非常大(接近或超过系统所能表示的最大整数范围时),可能会涉及到一些额外的处理,但在本题的情境下,通常可以认为是 。
-
总的时间复杂度:
- 综合来看,函数中主要的操作时间复杂度由将二进制转换为十进制的操作主导,所以整个函数
solution的时间复杂度为 ,即取决于输入的两个二进制字符串中较长的那个的长度。
- 综合来看,函数中主要的操作时间复杂度由将二进制转换为十进制的操作主导,所以整个函数
空间复杂度
-
变量占用空间:
- 在函数内部,定义了
decimal1、decimal2和decimal_sum这几个变量来存储中间结果和最终结果。这些变量所占用的空间取决于它们所存储的整数的大小。 - 当将二进制字符串转换为十进制整数时,存储这些十进制整数所需的空间与二进制字符串的长度有关。假设二进制字符串的长度为 ,那么转换后的十进制整数最大可能需要 的空间来存储(在极端情况下,比如全为
1的二进制字符串)。
- 在函数内部,定义了
-
总的空间复杂度:
- 不过,在整个函数执行过程中,除了这几个用于存储中间结果和最终结果的变量外,没有使用其他大量占用空间的数据结构。并且这几个变量所占用的空间主要还是由输入的二进制字符串长度决定(因为转换后的十进制整数大小与二进制字符串长度相关)。所以函数
solution的空间复杂度为 ,同样取决于输入的两个二进制字符串中较长的那个的长度。
- 不过,在整个函数执行过程中,除了这几个用于存储中间结果和最终结果的变量外,没有使用其他大量占用空间的数据结构。并且这几个变量所占用的空间主要还是由输入的二进制字符串长度决定(因为转换后的十进制整数大小与二进制字符串长度相关)。所以函数