二进制之和python一行代码秒题 | 豆包MarsCode AI刷题

70 阅读4分钟

二进制之和

问题描述

小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. 方法一:先转换为十进制后相加
    我们可以编写一个二进制转十进制的函数,先将 binary1​ binary2​转换为十进制数,再将它们相加,最后输出十进制结果。
  2. 方法二:直接按二进制规则相加
    也可以直接运用二进制相加的特性,得到二进制的相加结果,然后再使用 Python 的 int(binary, 2)​ 函数将二进制字符串转换为十进制数,得到最终结果。
  3. 方法三:使用 Python 内置函数暴力求解
    Python 提供了强大的内置函数,可以通过一行代码直接解决问题,省去了手动转换的麻烦。

具体实现

方法一:先转换为十进制后相加
  1. 编写一个函数,将二进制数转为十进制数;
  2. 将两个二进制数转换为十进制后相加;
  3. 输出最终的十进制结果。
方法二:直接按二进制规则相加
  1. 直接使用 Python 的 int(binary, 2)​ 函数将二进制数转换为十进制数;
  2. 对两个十进制数进行相加,得到结果;
  3. 输出相加后的结果。
方法三:使用 Python 内置函数
  1. 利用 Python 内置函数,直接将两个二进制字符串进行相加并转换为十进制;
  2. 输出最终结果。

PS:最终输出结果为字符串格式。

代码实现

方法一:

def solution(binary1, binary2):
    m = d(binary1)
    n = d(binary2)
    return str(m + n)

def d(binary_str):
    decimal_value = 0
    power = 0  
    # 从最低位开始处理
    for bit in reversed(binary_str):
        # 将当前位转换为整数并与2的power次方相乘
        decimal_value += int(bit) * (2 ** power)
        # 增加权重
        power += 1   
    return decimal_value

方法二:

def binary_sum(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(str(total % 2))  # 当前位
        carry = total // 2  # 更新进位
  
    # 如果还有进位,则需要追加一位
    if carry:
        result.append('1')
  
    # 反转结果并返回十进制的字符串形式
    return str(int(''.join(result[::-1]), 2))

方法三:

    def solution(binary1, binary2):
        return str(int(binary1, 2) + int(binary2, 2))

进制转换:

1. 十进制转化成2、8、16进制:

  • 10 --> 2: bin(3)​ 返回 "0b11"​,表示数字 3 的二进制形式。
  • 10 --> 8: oct(10)​ 返回 "0o12"​,表示数字 10 的八进制形式。
  • 10 --> 16: hex(255)​ 返回 "0xff"​,表示数字 255 的十六进制形式。

2. ​2、8、16​进制转化为十进制:

  • 2 --> 10: int('0b11', 2)​ 返回 3,将二进制字符串 "0b11"​ 转换为十进制数。
  • 8 --> 10: int('0o12', 8)​ 返回 10,将八进制字符串 "0o12"​ 转换为十进制数。
  • 16 --> 10: int('0x11', 16)​ 返回 17,将十六进制字符串 "0x11"​ 转换为十进制数。
    print("10 --> 2:",bin(3))
    print("10 --> 8:",oct(10))
    print("10 --> 16:",hex(255))
    print("2 --> 10:",int('0b11', 2))
    print("8 --> 10:",int('0o12', 8))
    print("16 --> 10:",int('0xff', 16))

image.png

3. 二进制、八进制、十六进制表示:

  • 在表示二进制时,数字前缀为 0b​(大小写均可)。
  • 在表示八进制时,数字前缀为 0o​(大小写均可)。
  • 在表示十六进制时,数字前缀为 0x​(大小写均可)。

4. 使用eval​函数执行字符串:

  • ​eval('0b11')​ 返回 3,执行二进制字符串的计算。
  • ​eval('0o12')​ 返回 10,执行八进制字符串的计算。
  • ​eval('0x11')​ 返回 17,执行十六进制字符串的计算。
    print(eval('0b11'))
    print(eval('0o12'))
    print(eval('0xff'))

image.png