LeetCode_Simple_67. Add Binary

2019.1.17

题目描述:

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

这题是二进制加法,本质上是与十进制加法类似的,只不过由遇十进一变成了遇二进一。

解法一:

设置一个进位carry,初值是0,,我们可以用两个指针分别从两个字符串的末尾开始向高位遍历,将三者相加,得到的和对二取余的值,加到结果字符串中,对二进行除法的值,赋给进位carry。如果在循环结束后carry是1,则需要在最高位增加一个1,即在结果字符串首部加1。

这里需要注意一点的是,如果两个字符串长度是不一致的,那么我们需要对较短的字符串前面补0,由于二进制的特点,高位补0是不影响二进制的值的,所以如果字符串可以取出值,就将字符取出再减去'0'得到int值,如果不能取出值,就直接赋0进行运算。

C++代码:

class Solution {
public:
    string addBinary(string a, string b) {
        string res;
        int i=a.size()-1,j=b.size()-1,carry=0,m,n,sum;
        while(i>=0||j>=0){
            if(i>=0)
                m=a[i--]-'0';
            else
                m=0;
            if(j>=0)
                n=b[j--]-'0';
            else
                n=0;
            sum=m+n+carry;
            res=to_string(sum%2)+res;
            carry=sum/2;
        }
        if(carry==1)
            res="1"+res;
        return res;
    }
};

执行时间:4ms

PS.可以考虑用三目运算符来使代码美观

优化后C++代码:

class Solution {
public:
    string addBinary(string a, string b) {
        string res = "";
        int i = a.size() - 1, j = b.size() - 1, carry = 0,m,n,sum;
        while (i >= 0 || j >= 0) {
            m = i >= 0 ? a[i--] - '0' : 0;
            n = j >= 0 ? b[j--] - '0' : 0;
            sum = m + n + carry;
            res = to_string(sum % 2) + res;
            carry = sum / 2;
        }
        return carry == 1 ? "1" + res : res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41637618/article/details/86526817