67. 二进制求和

2018-08-20  本文已影响0人  DAFFE

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

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

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

//先补齐较短串,相应元素相加分为四种情况+flag,另外单独考虑最后进位。
class Solution {
public:
    string addBinary(string a, string b) {
        string s="";
    int i,j,flag=0;
    for (i=a.size()-1,j=b.size()-1;i>=0||j>=0;i--,j--){
        if(j<0){b.insert(0,"0");j=0;}
        if(i<0){a.insert(0,"0");i=0;}//补齐
        switch((a[i]-'0')+(b[j]-'0')+flag){
            case 3:
                flag=1;
                s.insert(0,"1");
                break;
            case 2:
                flag=1;
                s.insert(0,"0");
                break;
            case 1:
                flag=0;
                s.insert(0,"1");
                break;
            case 0:
                s.insert(0,"0");
                flag=0;
                break;
        }
    }
    if(flag==1) s.insert(0,"1");
    return s;
    }
};

简洁写法:

class Solution
{
public:
    string addBinary(string a, string b)
    {
        string s = "";
        
        int c = 0, i = a.size() - 1, j = b.size() - 1;
        while(i >= 0 || j >= 0 || c == 1)//循环直到i<0,j<0且进位=0
        {
            c +=    i >= 0 ? a[i --] - '0' : 0;//i=0 c+0
            c +=    j >= 0 ? b[j --] - '0' : 0;//c=sum(a+b+进位);
            s = char(c % 2 + '0') + s;//进位之后:0:sum=2/0;1:sum=1
            c /= 2;// 表示进位 1:sum=2;0:sum=0/1
        }
        return s;
    }
};
上一篇下一篇

猜你喜欢

热点阅读