[LeetCode] Add Binary

2014-11-24 02:24:12 · 作者: · 浏览: 1
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) {  
        // IMPORTANT: Please reset any member data you declared, as  
        // the same Solution instance will be reused for each test case.  
        if(a.size() == 0)  
            return b;  
  
        if(b.size() == 0)  
            return a;  
  
        string sum;  
        int ain = 0, now = 0, tmp = 0;  
  
        string::reverse_iterator a_riter = a.rbegin(), b_riter = b.rbegin();  
        for(; a_riter != a.rend() && b_riter != b.rend(); ++a_riter, ++b_riter) {  
            tmp = *a_riter-48+*b_riter-48+ain;  
            now = tmp % 2;  
            if(tmp / 2) {  
                ain = 1;  
            }  
            else {  
                ain = 0;  
            }  
            sum.insert(sum.begin(), 1, now+48);  
        }  
  
        if(a_riter == a.rend() && b_riter != b.rend()) {  
            while(b_riter != b.rend() && ain == 1) {  
                tmp = *b_riter-48+ain;  
                now = tmp % 2;  
                if(tmp / 2) {  
                    ain = 1;  
                }  
                else {  
                    ain = 0;  
                }  
                sum.insert(sum.begin(), 1, now+48);  
                ++b_riter;  
            }  
            if(b_riter != b.rend()) {  
                sum.insert(sum.begin(), b.rend().base(), b_riter.base());  
            }  
        }  
  
        if(b_riter == b.rend() && a_riter != a.rend()) {  
            while(a_riter != a.rend() && ain == 1) {  
                tmp = *a_riter-48+ain;  
                now = tmp % 2;  
                if(tmp / 2) {  
                    ain = 1;  
                }  
                else {  
                    ain = 0;  
                }  
                sum.insert(sum.begin(), 1, now+48);  
                ++a_riter;  
            }  
            if(a_riter != a.rend()) {  
                sum.insert(sum.begin(), a.rend().base(), a_riter.base());  
            }  
        }  
  
        if(ain) {  
            sum.insert(sum.begin(), 1, '1');  
        }  
  
        return sum;  
    }  
};