LeetCode67:二进制求和解析

给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例1:

输入: a = "11", b = "1"
输出: "100"

示例2:

输入: a = "1010", b = "1011"
输出: "10101"

这个题的第一个想法就是把字符串直接转换成二进制数然后相加,之后再转换成字符串。但是这样也就没什么算法的意思了,C++中也没有这样的简单实现,但python是有的,所以后面的代码中python用了这种简单的方法,只是字符串不能直接转换成二进制,而是用int()函数转换成了十进制相加,然后用bin()函数将十进制数转换为二进制字符串。
接下来说一下C++的实现,C++就老老实实的遍历字符串,利用进位等方法把两个字符串相加,这里需要注意的是,二进制高位在字符串前面,而低位在字符串后面,所以遍历的时候需要反向遍历,之后就和之前两个数组相加没什么区别了,设置一个进位,遍历的长度是最长字符串长度,如果索引达到短字符串最长长度就不再加短字符串元素,否则就是两个字符串元素加进位。最后遍历完之后还有进位就再对新字符串前面加个1。
C++源代码:

class Solution {
public:
    string addBinary(string a, string b) {
        string c = "";
        int carry = 0, num = 0;
        if (a.length()<b.length())
        {
            c = a;
            a = b;
            b = c;
        }
        c = "";
        int la = a.length();
        int lb = b.length();
        for (int i=0;i<la;i++)
        {
            if (i>lb-1)
                num = (int)a[la-1-i]%48 + carry;
            else
                num = (int)a[la-1-i]%48 + (int)b[lb-1-i]%48 + carry;
            carry = num / 2;
            c = to_string(num % 2) + c;
        }
        if (carry == 1)
            c = to_string(carry) + c;
        return c;
    }
};

python3源代码:

class Solution:
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        c = int(a, 2) + int(b, 2)
        c = bin(c)
        return c[2:]

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/83574782