题目:

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

For example,
a = "11"
b = "1"
Return "100".

解题思路1:判断当前字符所表示的数字,产生输出和进位。缺点:程序比较复杂。


代码1:

class Solution {
public:
    string addBinary(string a, string b) {
        char carry='0';
        string c;
        if(a.empty())return b;
        if(b.empty())return a;
        string::iterator itr_a=a.end()-1;
        string::iterator itr_b=b.end()-1;
        while(itr_a>=a.begin()&&itr_b>=b.begin()){
            if(*itr_a=='0'&&*itr_b=='0'){
                if(carry=='0'){
                    c.insert(c.begin(),'0');
                }else if(carry=='1'){
                    c.insert(c.begin(),'1');
                    carry='0';
                }
                itr_a--;itr_b--;
                continue;
            }
            if(*itr_a=='0'&&*itr_b=='1'){
                if(carry=='0'){
                    c.insert(c.begin(),'1');
                }else if(carry=='1'){
                    c.insert(c.begin(),'0');
                    carry='1';
                }
                itr_a--;itr_b--;
                continue;
            }
            if(*itr_a=='1'&&*itr_b=='0'){
                if(carry=='0'){
                    c.insert(c.begin(),'1');
                }else if(carry=='1'){
                    c.insert(c.begin(),'0');
                    carry='1';
                }
                itr_a--;itr_b--;
                continue;
            }
            if(*itr_a=='1'&&*itr_b=='1'){
                if(carry=='0'){
                    c.insert(c.begin(),'0');
                    carry='1';
                }else if(carry=='1'){
                    c.insert(c.begin(),'1');
                    carry='1';
                }
                itr_a--;itr_b--;
                continue;
            }
        }
        while(itr_a>=a.begin()){
            if(carry=='0'){
                c.insert(c.begin(),a.begin(),itr_a+1);
                break;
            }
            if(*itr_a=='0'&&carry=='1'){
                c.insert(c.begin(),'1');
                carry='0';
                itr_a--;
                continue;
            }
            if(*itr_a=='1'&&carry=='1'){
                c.insert(c.begin(),'0');
                carry='1';
                itr_a--;
                continue;
            }
        }
        while(itr_b>=b.begin()){
            if(carry=='0'){
                c.insert(c.begin(),b.begin(),itr_b+1);
                break;
            }
            if(*itr_b=='0'&&carry=='1'){
                c.insert(c.begin(),'1');
                carry='0';
                itr_b--;
                continue;
            }
            if(*itr_b=='1'&&carry=='1'){
                c.insert(c.begin(),'0');
                carry='1';
                itr_b--;
                continue;
            }
        }
        if(carry=='1'){
            c.insert(c.begin(),'1');
        }
        return c;
    }
};

解题思路2:首先判断a和b的长度,取其中更长的size作为加法运算的次数。在加法运算时,将每一个char转化为int型数字进行运算并记录进位。优点:程序简单。


代码2:

class Solution {
public:
    string addBinary(string a, string b) {
        int carry=0;
        string c;
        if(a.empty())return b;
        if(b.empty())return a;
        const size_t n=max(a.size(),b.size());
        for(int i=0;i<n;i++){
            int val_a=i<a.size()?a[a.size()-1-i]-'0':0;
            int val_b=i<b.size()?b[b.size()-1-i]-'0':0;
            int val_c=(val_a+val_b+carry)%2;
            carry=(val_a+val_b+carry)/2;
            c.insert(c.begin(),val_c+'0');
        }
        if(carry==1){
            c.insert(c.begin(),'1');
        }
        return c;
    }
};