题目大意

对两个二进制的字符串求和。

解题思路

该题较为简单,面试遇到硬写,不必非要按照如下代码写。

二进制数相加,并且保存在string中,要注意的是如何将string和int之间互相转换,并且每位相加时,会有进位的可能,会影响之后相加的结果。而且两个输入string的长度也可能会不同。这时我们需要新建一个string,它的长度是两条输入string中的较大的那个,并且把较短的那个输入string通过在开头加字符‘0’来补的较大的那个长度。这时候我们逐个从两个string的末尾开始取出字符,然后转为数字,想加,如果大于等于2,则标记进位标志carry,并且给新string加入一个字符‘0’。

代码

从后往前依次相加,计算该位的值和进位值。最高位如要进位就添加一个位,最后把结果翻转。

class Solution(object):
    def addBinary(self, a, b):
        """ :type a: str :type b: str :rtype: str """
        result = []
        val = 0
        carry = 0
        lenA = len(a)
        lenB = len(b)
        if lenA < lenB: # 注意坑:确保A比B长, 所以值长度也要交换
            a, b = b, a
            lenA, lenB = lenB, lenA 
        for i in range(lenA):  
            print carry
            val = carry
            val += int(a[-(i+1)])  # 从最后一位开始取
            if i < lenB:
                val += int(b[-(i+1)])
            print val, carry
            carry = val // 2
            val = val % 2  # 注意坑:注意这里val变化了,必须放下面
            print val, carry
            result.append(str(val))

        if carry:
            result.append(str(carry))
        return ''.join(result[::-1])

总结

py2和py3的除法区别:
在python2中// = / 都为整数(如1),而在3中,3 / 2 = 1.5, 3 // 2 = 1