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

51 阅读5分钟

问题描述

小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 更长,程序会交换 binary1binary2,这样可以保证在计算时 binary1 总是较长的。

接着,程序初始化了两个变量 n1n2,分别用来存储二进制字符串对应的整数值。index 初始为 1,用于控制二进制权重的递增(2 的幂次)。

然后,程序从 binary1binary2 的最后一位(最低位)开始进行逐位相加。通过 for i in range(len1-1,-1,-1) 循环,程序逐位遍历 binary1,从右到左。对于每一位,如果该位在两个二进制字符串中都有值(即 i >= len1 - len2),就将 binary1binary2 的当前位值转换为整数并加到 n1n2,同时累加权重 index。如果该位只在 binary1 中有值,则只将 binary1 的当前位值累加到 n1

累加完所有位后,n1 + n2 得到的就是两个二进制字符串相加的结果。程序最终返回这个结果的字符串形式。

最后,在 if __name__ == "__main__": 部分,程序通过一些测试用例来验证实现的正确性。

总结来说,程序通过逐位计算的方式将两个二进制字符串转换为整数并相加,最后返回结果。这个方法考虑了二进制加法的基础原理,并通过索引和权重管理了加法过程。

我想这个过程虽然看起来复杂,但是还是比较好懂的!如果我求助于豆包AI会怎么样呢?

豆包:

好的,让我们来分析一下这个问题。

问题理解

我们需要将两个二进制字符串相加,并以十进制的形式返回结果。二进制字符串可能非常长,因此需要考虑大数处理的问题。

数据结构选择

由于二进制字符串可能非常长,直接使用内置的整数类型可能会导致溢出。因此,我们需要手动处理二进制数的加法。

算法步骤

  1. 对齐二进制字符串:确保两个二进制字符串的长度相同,较短的字符串可以在前面补零。
  2. 逐位相加:从最低位(最右端)开始,逐位相加,并处理进位。
  3. 处理进位:如果某一位的和大于等于2,则需要进位。
  4. 生成结果:将逐位相加的结果拼接成一个新的二进制字符串。
  5. 转换为十进制:将最终的二进制字符串转换为十进制形式。

时间复杂度

由于我们需要逐位处理二进制字符串,时间复杂度为 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有很多函数可以快速实现复杂度功能,一定要记住一些,节省非常多时间。