问题描述
小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'
做这道题目的时候还是国庆。当时知识真的非常缺乏。当时也不想问豆包,于是就打了暴力!
def solution(binary1, binary2):
len1=len(binary1)
len2=len(binary2)
if len1<len2:
temp=len2
len2=len1
len1=temp
t=binary2
binary2=binary1
binary1=t
#b1 is longer
index=1;n1=0;n2=0
for i in range(len1-1,-1,-1):
if i>=len1-len2:#[i] and [i-(len1-len2)]
n1+=int(binary1[i])*index
n2 += int(binary2[i-len1+len2]) * index
else:
n1+=int(binary1[i])*index
index*=2
return str(n1+n2)
if __name__ == "__main__":
# You can add more test cases here
print(solution("101", "110") == "11")
print(solution("111111", "10100") == "83")
print(solution("111010101001001011", "100010101001") == "242420")
print(solution("111010101001011", "10010101001") == "31220")
居然真的过了!
但是我自己都忘记我的逻辑是什么了,问问GPT,我写了个什么东西:
GPT:
这段程序的目的是对两个二进制字符串进行加法运算。以下是分析:
首先,程序通过 len(binary1) 和 len(binary2) 获取两个二进制字符串的长度,并确保 binary1 是较长的字符串。如果 binary2 更长,程序会交换 binary1 和 binary2,这样可以保证在计算时 binary1 总是较长的。
接着,程序初始化了两个变量 n1 和 n2,分别用来存储二进制字符串对应的整数值。index 初始为 1,用于控制二进制权重的递增(2 的幂次)。
然后,程序从 binary1 和 binary2 的最后一位(最低位)开始进行逐位相加。通过 for i in range(len1-1,-1,-1) 循环,程序逐位遍历 binary1,从右到左。对于每一位,如果该位在两个二进制字符串中都有值(即 i >= len1 - len2),就将 binary1 和 binary2 的当前位值转换为整数并加到 n1 和 n2,同时累加权重 index。如果该位只在 binary1 中有值,则只将 binary1 的当前位值累加到 n1。
累加完所有位后,n1 + n2 得到的就是两个二进制字符串相加的结果。程序最终返回这个结果的字符串形式。
最后,在 if __name__ == "__main__": 部分,程序通过一些测试用例来验证实现的正确性。
总结来说,程序通过逐位计算的方式将两个二进制字符串转换为整数并相加,最后返回结果。这个方法考虑了二进制加法的基础原理,并通过索引和权重管理了加法过程。
我想这个过程虽然看起来复杂,但是还是比较好懂的!如果我求助于豆包AI会怎么样呢?
豆包:
好的,让我们来分析一下这个问题。
问题理解
我们需要将两个二进制字符串相加,并以十进制的形式返回结果。二进制字符串可能非常长,因此需要考虑大数处理的问题。
数据结构选择
由于二进制字符串可能非常长,直接使用内置的整数类型可能会导致溢出。因此,我们需要手动处理二进制数的加法。
算法步骤
- 对齐二进制字符串:确保两个二进制字符串的长度相同,较短的字符串可以在前面补零。
- 逐位相加:从最低位(最右端)开始,逐位相加,并处理进位。
- 处理进位:如果某一位的和大于等于2,则需要进位。
- 生成结果:将逐位相加的结果拼接成一个新的二进制字符串。
- 转换为十进制:将最终的二进制字符串转换为十进制形式。
时间复杂度
由于我们需要逐位处理二进制字符串,时间复杂度为 O(n),其中 n 是二进制字符串的长度。这满足题目要求的时间复杂度不超过 O(n^2)。
总结
通过逐位相加并处理进位,我们可以有效地处理大数加法问题。希望这些思路能帮助你更好地解决这个问题。
也还是比较暴力的做法!
再问问GPT怎么做这道题:
GPT:
def solution(binary1, binary2):
decimal1 = int(binary1, 2)
decimal2 = int(binary2, 2)
return str(decimal1 + decimal2)
让我非常惊讶!原来python的内置函数如此强大!
总结
1.善用AI: AI确确实实可以帮助我们学习编程与算法!
2.python没有想象我中简单: python有很多函数可以快速实现复杂度功能,一定要记住一些,节省非常多时间。