青训营X豆包MarsCode 技术训练营第二课 | 豆包MarsCode AI刷题

41 阅读5分钟

学习方法与心得

题目解析:二进制字符串相加(以题目为例)

题目背景

小U和小R希望找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。由于二进制串可能非常长,常规方法(如直接转换为十进制再相加)可能因超出整数范围而失败。因此,我们需要设计一个算法,既能处理大数相加,又能保证时间复杂度不超过O(n^2)。

思路分析

  1. 直接转换的局限性

    • 题目中给出的解法(将二进制字符串转换为十进制整数再相加)虽然直观,但受限于编程语言的整数范围。对于非常长的二进制字符串,这种方法可能会导致整数溢出。
  2. 逐位相加法

    • 我们可以从二进制字符串的最低位(即最右边)开始,逐位进行相加,并处理进位。
    • 这种方法不需要将整个二进制字符串转换为十进制整数,因此可以避免整数溢出的问题。
  3. 时间复杂度

    • 逐位相加法的时间复杂度主要取决于两个二进制字符串的长度。在最坏情况下(即两个字符串长度相等且每一位都需要进位),时间复杂度为O(n),其中n是字符串的长度。
    • 题目中要求时间复杂度不超过O(n^2),因此逐位相加法满足要求。

图解

(由于文本限制,无法直接绘制图解,但可以通过以下步骤描述)

  1. 初始化一个空字符串用于存储结果。
  2. 从两个二进制字符串的最低位开始,逐位相加,并将结果(0或1)添加到结果字符串的最高位(即最左边)。
  3. 处理进位:如果相加的结果大于等于2,则进位为1,否则进位为0。
  4. 重复上述步骤,直到处理完所有位。
  5. 如果最高位有进位,则将其添加到结果字符串中。
  6. 由于结果字符串是以二进制形式存储的,因此最后需要将其转换为十进制形式。但在这个问题中,我们只需要返回二进制相加后的结果(以字符串形式),因此这一步可以省略。

代码详解

python复制代码
	def solution(binary1, binary2):

	    # 将两个二进制字符串反转,以便从最低位开始相加

	    binary1 = binary1[::-1]

	    binary2 = binary2[::-1]

	    

	    # 初始化结果字符串和进位

	    result = []

	    carry = 0

	    

	    # 逐位相加

	    i, j = 0, 0

	    while i < len(binary1) or j < len(binary2) or carry:

	        # 获取当前位的值(如果字符串已经遍历完,则默认为0)

	        digit1 = int(binary1[i]) if i < len(binary1) else 0

	        digit2 = int(binary2[j]) if j < len(binary2) else 0

	        

	        # 计算当前位的和以及进位

	        total = digit1 + digit2 + carry

	        result_digit = total % 2  # 当前位的值

	        carry = total // 2  # 进位

	        

	        # 将当前位的值添加到结果字符串中

	        result.append(str(result_digit))

	        

	        # 移动到下一位

	        i += 1

	        j += 1

	    

	    # 将结果字符串反转并拼接成最终结果

	    return ''.join(result[::-1])

	 

	# 测试用例

	print(solution("101", "110") == "1011")  # 注意:结果应为二进制相加后的结果,再转换为十进制则为"11",但题目要求返回二进制形式

	print(solution("111111", "10100") == "1000011")

	print(solution("111010101001001011", "100010101001") == "111100000000000110")  # 注意:这里的结果也是二进制形式

	print(solution("111010101001011", "10010101001") == "1111111110101000")

注意:上述代码中的print语句中的==是用于测试目的的,实际使用时应该去掉或替换为适当的断言语句。另外,由于题目要求返回二进制相加后的结果(以字符串形式),因此上述代码中的print语句输出的结果也是二进制形式的。如果需要将其转换为十进制形式进行验证,可以使用int()函数进行转换。

知识总结

新知识点

  • 逐位相加法:这是一种处理大数相加的有效方法,可以避免整数溢出的问题。通过从最低位开始逐位相加并处理进位,可以得到正确的结果。
  • 字符串反转:在处理二进制字符串时,为了方便从最低位开始相加,可以将字符串反转。在相加完成后再反转回来即可得到最终结果。

学习建议

  • 理解算法思想:掌握逐位相加法的思想是关键。要理解如何从最低位开始逐位相加并处理进位。
  • 动手实践:通过编写代码来加深理解。可以尝试处理不同长度的二进制字符串以及包含进位的情况。
  • 拓展应用:除了二进制相加外,逐位相加法还可以应用于其他进制数的相加以及大数相乘等问题。可以尝试将这些算法思想应用到实际问题中。

希望这些学习方法和心得能够帮助你更好地理解和掌握二进制字符串相加的问题以及相关的算法思想。