AI刷题成长记录|豆包MarsCode AI刷题

103 阅读6分钟

记录攻克下来的第一次难题:

题目:

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

代码解析:

def solution(binary1, binary2):
    # 将两个二进制字符串反转,以便从低位开始加
    binary1 = binary1[::-1]
    binary2 = binary2[::-1]
    
    max_len = max(len(binary1), len(binary2))
    carry = 0
    result = []

    for i in range(max_len):
        # 获取当前位的值,若超过长度则默认为0
        bit1 = int(binary1[i]) if i < len(binary1) else 0
        bit2 = int(binary2[i]) if i < len(binary2) else 0
        
        # 当前位的和加上进位
        total = bit1 + bit2 + carry
        result.append(total % 2)  # 当前位结果
        carry = total // 2         # 进位

    # 如果还有进位需要处理,添加进结果
    if carry:
        result.append(carry)

    # 反转结果并转换为十进制
    decimal_result = sum(bit * (2 ** i) for i, bit in enumerate(result))
    
    return str(decimal_result)

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")

解答思路:

这道题要求将两个二进制字符串相加并以十进制的形式返回结果。为了解决这个问题,我们需要模拟二进制加法的过程并进行十进制转换。首先,为了方便从低位到高位逐位计算,我们可以将两个二进制字符串反转。接着,找到较长字符串的长度,按位遍历两字符串。如果当前位存在,则直接取值,否则视为 0。对于每一位,我们将两个二进制数对应位的值以及前一位产生的进位相加,结果取模 2 得到当前位的值,同时通过整除 2 得到新的进位。如果遍历结束后仍有进位,我们需要将其加入结果中。二进制加法的结果存储在列表中,此时是从低位到高位的顺序。最后,我们将该列表还原为正常顺序,并通过逐位计算权重(即2i2^i)的方法,将二进制数转换为十进制。这个过程的核心是逐位模拟加法,并结合进位处理确保结果的正确性,整个算法的时间复杂度为 O(n)。

整个学习过程中知识点记录:

列表生成方法

单层列表生成:

# 生成从 1 到 10 的平方
squares = [x**2 for x in range(1, 11)]
print(squares)  # [1, 4, 9, ..., 100]

# 生成包含偶数的列表
evens = [x for x in range(20) if x % 2 == 0]
print(evens)  # [0, 2, 4, ..., 18]

嵌套列表生成:

# 创建一个 3x3 的矩阵
matrix = [[row * col for col in range(1, 4)] for row in range(1, 4)]
print(matrix)  # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

# 将嵌套列表展开为一维列表
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 2, 4, 6, 3, 6, 9]

在整个学习 Python 的过程中,我逐渐掌握了许多基础用法,并在不断的练习中巩固了这些知识,这让我对编程有了更加深刻的理解和灵活的运用能力。Python 作为一门简洁且强大的语言,其直观的语法和丰富的标准库让我在学习过程中感受到事半功倍的效果。

通过学习,我认识到列表生成式是 Python 一项非常高效的功能,它让我能够在一行代码中完成复杂的列表操作,尤其是在处理数据时极为方便;而嵌套列表生成更让我体验到代码的简洁性,例如在矩阵构造和数据展开中的应用。除此之外,学习排序操作让我明白 Python 提供的 sorted() 函数不仅灵活,还能通过自定义排序规则处理复杂的数据结构,比如按字典的值排序或者对嵌套列表中的特定字段排序等,这种能力极大地提升了我的数据处理效率。

在字典操作中,我学会了如何高效地存取数据,并通过遍历和条件判断完成动态更新,同时通过按键值排序的技巧处理数据变得更加得心应手。此外,集合操作让我了解了如何通过数学集合运算快速解决去重、求交集等问题,这是在处理大规模数据时非常实用的工具。

字符串操作部分让我意识到,虽然字符串看似简单,但它在数据处理中的地位非常重要。通过学习字符串的分割、拼接、替换等功能,我能够轻松处理文本格式化任务,比如批量修改文件内容或者解析日志信息等。而文件操作则让我进一步理解了如何使用 with open 的上下文管理器,确保文件在操作后能正确关闭,这种细节上的严谨让我在编程习惯上有了提升。

同时,我也接触了 Python 的异常处理机制。在实际开发中,代码总会遇到各种错误,通过使用 try...except 块,我可以优雅地处理异常,确保程序的稳定性。结合文件操作和异常处理,我完成了一些综合性的任务,比如日志记录和数据备份,这些都让我对 Python 的实际应用场景有了更深入的体会。

最后,在接触到一些标准库如 math 和第三方库如 numpy 时,我认识到 Python 之所以强大,正是因为它庞大而优质的生态系统。这些库让我能够快速实现复杂的数学运算、数据分析等任务,而不必从零开始实现功能。随着学习的深入,我逐渐学会如何利用这些工具完成更高效的编程。

在学习的过程中,最大的收获不仅是掌握了这些基础用法,更是养成了良好的编程习惯,学会如何以清晰、规范的方式实现代码。在练习中不断巩固知识,不仅提高了我的代码能力,还让我学会以更加逻辑化和模块化的思维来分析和解决问题。Python 的学习让我意识到,编程是一门实践的艺术,只有通过不断的练习和总结,才能真正将知识内化为能力。