青训营X豆包MarsCode 技术训练营第三篇 | 豆包MarsCode AI 刷题

52 阅读4分钟

学习笔记:二进制字符串加法及其十进制转换


题目描述

给定两个二进制字符串 binary1binary2,对其进行二进制加法,返回十进制字符串结果。 例如:

  • 输入:binary1 = "101", binary2 = "110" 输出:"11"(二进制1011101011,十进制为11

题目解析
1. 思路分析

这道题主要考察二进制加法以及处理进位的逻辑。步骤如下:

  1. 统一长度:二进制字符串长度可能不一致,需通过前置补零使它们长度相等,方便逐位运算。

  2. 逐位相加,处理进位:

    • 从最低位开始,逐位相加,并记录每次的进位。
    • 当前位的结果是 (bit1 + bit2 + carry) % 2
    • 更新进位为 (bit1 + bit2 + carry) // 2
  3. 处理最高位进位:加法完成后,若进位为1,则需在结果前添加1

  4. 结果转换:将最终的二进制字符串转换为十进制字符串。

2. 示例分析

以输入 binary1 = "101", binary2 = "110" 为例:

  • 补零对齐binary1 = "101", binary2 = "110"

  • 逐位加法:

    • 第三位:1 + 0 + 0(carry) = 1,结果1,进位0
    • 第二位:0 + 1 + 0(carry) = 1,结果11,进位0
    • 第一位:1 + 1 + 0(carry) = 2,结果011,进位1
  • 处理进位:最终结果为1011,转换为十进制为11


代码实现
def solution(binary1, binary2):
    # 确保两个二进制字符串长度相同,前面填充0
    len_max = max(len(binary1), len(binary2))
    binary1 = binary1.zfill(len_max)
    binary2 = binary2.zfill(len_max)
​
    carry = 0  # 进位
    result = ''  # 结果
​
    # 从最低位开始遍历字符串
    for i in range(len_max - 1, -1, -1):
        bit1 = int(binary1[i])
        bit2 = int(binary2[i])
        sum_bits = bit1 + bit2 + carry  # 当前位的和加上进位
        carry = sum_bits // 2  # 更新进位
        result = str(sum_bits % 2) + result  # 计算当前位的结果
​
    # 如果最后还有进位,需要添加到结果的最高位
    if carry > 0:
        result = '1' + result
​
    # 将二进制结果转换为十进制字符串
    return str(int(result, 2))
​
if __name__ == "__main__":
    # 测试用例
    print(solution("101", "110"))  # 输出 "11"
    print(solution("111111", "10100"))  # 输出 "83"
    print(solution("111010101001001011", "100010101001"))  # 输出 "242420"
    print(solution("111010101001011", "10010101001"))  # 输出 "31220"

知识总结
1. 二进制加法基础
  • 二进制加法规律:

    加法结果进位
    0+000
    0+110
    1+101
    1+1+1(carry)11
  • 实现时通常从最低位开始逐位加,并注意更新进位。

2. zfill 方法

Python 的 zfill 方法非常适合处理字符串长度不足的问题,它会在字符串左侧补零,确保两字符串长度一致。

3. Python 字符串拼接与类型转换
  • 拼接:在字符串的操作中,常用 result = str(…) + result 来在结果前添加字符。

  • 类型转换:

    • int(binary, 2):将二进制字符串转为十进制整数。
    • str(value):将整数转为字符串。

学习建议
  1. 强化基础:二进制运算是计算机基础,多练习二进制加减法,理解进位与补码规则。
  2. 分解问题:复杂问题拆解为小问题,逐步解决,比如这题的“补零”、“逐位运算”、“处理进位”。
  3. 关注内置函数:熟悉字符串操作的内置方法,如zfill、类型转换函数,提升代码简洁性。
  4. 实践练习:可以拓展此题,试试三进制、四进制等其他数制加法,进一步巩固知识点。

图解

以下是例题 binary1 = "101", binary2 = "110" 的加法过程:

Step 1: 补零对齐
  binary1: 101
  binary2: 110

Step 2: 从右到左逐位相加
   位1: 1+0+0(carry)=1,结果 1,进位 0
   位2: 0+1+0(carry)=1,结果 11,进位 0
   位3: 1+1+0(carry)=2,结果 011,进位 1

Step 3: 处理最高位进位
   最终结果为 1011 (二进制) -> 11 (十进制)