python leetcode 二进制求和【简单题】

1. 读懂题目

2. 分析,推导解法,产生思路。

解题思路:(1)模拟二进制转换。借鉴「列竖式」的方法,末尾对齐,逐位相加。逢二进一。

(2)位运算,可不使用加减乘除。(位运算的方式参考于官方题解)

3. 代码实现

class Solution(object):
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        # 模拟:重点考虑进位
        # 借鉴「列竖式」的方法,末尾对齐,逐位相加。逢二进一
        while len(a) > len(b) : b = '0' + b     # 对齐字符串a,b
        while len(a) < len(b) : a = '0' + a
        i = len(a) - 1
        carry = 0       # 标志进位
        res = ''
        while i >= 0 :
            sum = int(a[i]) + int(b[i]) + carry
            carry = int(sum / 2)     # 当sum为3/2时,进位为1;为1/0时进位为0
            res += str(sum % 2)
            i = i - 1
        if carry : res += str(carry)
        return res[::-1]
    def addBinary1(self, a, b):
        # 位运算,不使用加减乘除
        """
        1. 把a和b转换成整型数字x,y,在接下来的过程中,x保存结果,y保存进位。
        2. 当进位不为0时:
            计算当前x与y的无进位相加结果:answer = x + y
            计算当前x和y的进位:carry = (x & y) << 1
            完成本次循环,更新x = answer, y = carry
        3. 返回x的二进制形式
        """
        x = int(a,2)      # x保存结果
        y = int(b,2)      # y 保存进位

        while y != 0:
            print(x,y,sep='  ')
            answer = x ^ y
            carry = (x & y) << 1
            x = answer
            y = carry
        return bin(x)[2:]

补充:位运算面试时用的不多,以后有时间可以刷一下位运算的相关题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值