进制变换的巧思

86 阅读5分钟

55题二进制之和

问题描述

小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'

题目分析

这道题要求将两个非常长的二进制字符串相加,并以十进制的形式返回其和。由于二进制字符串可能很长,不能直接转化为整型处理,因此需要一种有效的算法在限制的时间复杂度内完成计算。

于是这题有其中一种思路是这样的:

解题思路一:

方法:逐位模拟二进制加法

我们可以通过模拟二进制加法的过程来解决问题,具体步骤如下:

  1. 初始化指针和进位:从两个字符串的末尾开始,逐位进行加法。使用 carry 变量记录进位。

  2. 逐位计算和:逐位计算当前位的和,加上进位。计算结果对 2 取余,更新当前位的值。计算结果除以 2,更新进位。

  3. 处理剩余进位:当遍历结束后,如果仍有进位,追加到结果中。

  4. 转换为十进制:最后将计算出的二进制和直接转换为十进制。

代码实现

def solution:
    # 初始化指针和进位
    i, j = len(binary1) - 1, len(binary2) - 1
    carry = 0
    result = []

    # 模拟逐位加法
    while i >= 0 or j >= 0 or carry:
        bit1 = int(binary1[i]) if i >= 0 else 0
        bit2 = int(binary2[j]) if j >= 0 else 0
        
        # 计算当前位的和
        total = bit1 + bit2 + carry
        result.append(total % 2)  # 当前位的值
        carry = total // 2       # 更新进位

        # 更新指针
        i -= 1
        j -= 1

    # 转换结果为十进制
    binary_sum = ''.join(map(str, reversed(result)))
    return str(int(binary_sum, 2))


关键点总结

  • 逐位加法:通过从低位到高位模拟二进制加法,避免处理大数。
  • 进位处理:注意在所有位都遍历完后仍需检查是否有进位。
  • 转换十进制:最终的二进制和可以直接用内置函数 int(binary_string, 2) 转为十进制。
  • 如果要求直接返回二进制结果,也可以在上述算法中省略十进制转换的步骤,只需要返回 ''.join(map(str, reversed(result))) 即可。该算法非常灵活,可以根据具体需求调整返回值。

解题思路

本问题的关键在于将二进制字符串相加并返回十进制结果。我们可以通过以下步骤完成:

  1. 二进制转十进制

    • 将输入的二进制字符串转化为十进制整数。Python 提供了内置的 int() 方法,可以直接将二进制字符串(通过指定基数 2)转换为十进制整数。
  2. 整数加法运算

    • 转换后的十进制整数直接相加,利用 Python 的任意大数支持,可以安全处理非常大的二进制数的加法。
  3. 结果转字符串

  • 题目要求返回十进制和的字符串形式,因此将结果用 str() 转换为字符串。、

算法实现

以下是完整的算法实现步骤:

  1. 函数设计:输入:两个二进制字符串。输出:二进制字符串的十进制和(字符串形式)。

  2. 异常处理:检查输入是否为有效的二进制字符串(即仅包含 01)。如果输入无效,返回错误提示信息。

  3. 转化与计算:使用 int(binary, 2) 将二进制字符串转为十进制。对两个十进制整数求和。

  4. 返回结果:使用 str() 将计算结果转为字符串形式。

完整代码实现

python复制代码def solution(binary1, binary2):
    try:
        # 转换二进制为十进制整数
        decimal1 = int(binary1, 2)
        decimal2 = int(binary2, 2)
        
        # 求和
        decimal_sum = decimal1 + decimal2
        
        # 返回十进制结果的字符串形式
        return str(decimal_sum)
    except ValueError:
        # 如果输入无效,返回提示
        return "Invalid binary input"

if __name__ == "__main__":
    # 测试用例
    print(solution("101", "110"))  # 输出: "11"
    print(solution("111111", "10100"))  # 输出: "83"
    print(solution("111010101001001011", "100010101001"))  # 输出: "242420"
    print(solution("111010101001011", "10010101001"))  # 输出: "31220"
    print(solution("11", "1"))  # 输出: "4"
    # 测试无效输入
    print(solution("10102", "110"))  # 输出: "Invalid binary input"

算法详解

1. 二进制字符串转十进制

  • Python 提供了 int() 函数支持多进制到十进制的转换:

    python复制代码int("101", 2)  # 将二进制字符串 '101' 转换为十进制整数 5
    
  • 通过将 binary1binary2 分别转换为十进制整数,可以方便地对它们进行加法操作。

2. 十进制整数加法

  • 转换后的十进制整数直接进行加法运算:

    python复制代码decimal_sum = decimal1 + decimal2
    
  • Python 的整数类型支持任意精度,因此即使输入的二进制字符串非常长,也不会有溢出问题。

3. 转换结果为字符串

  • 为了符合题目要求,将计算结果(十进制整数)转为字符串形式:

    python复制代码return str(decimal_sum)
    

4. 输入验证

  • 如果输入的二进制字符串包含非法字符(如非 01 的字符),会引发 ValueError 异常。我们在代码中捕获该异常并返回错误提示信息:

    python复制代码try:
        decimal1 = int(binary1, 2)
    except ValueError:
        return "Invalid binary input"