LeetCode 067. Add Binary

67. Add Binary

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

For example,
a = 
"11"
b = 
"1"
Return "100".
class Solution {
public:
    string addBinary(string a, string b) {
    }
};
解題思路:
  • 自己的解題思路
主要考慮可能出現的邊界情況,如”0010”,”  10”;這樣的邊界情況。但是,我還沒有處理出現”   a1030  ”;這樣的情況。這樣的情況應該是非法輸入,但是我的程序會認爲它是”10”。解題的核心思路很簡單,(1)同時存在的情況;(2)只有一個存在的情況,長度較長的那個;(3)存在最後的進位的情況。
  • 別人的解題思路
將上面的3種情況進行統一處理;真是厲害。而且使用了很多技巧。
學習收穫:
  • 如果每次都要進行頭插入的話。可以換個角度考慮問題。
先尾插入,最後再進行倒序。
附件:程序
1、自己的程序:
class Solution
{
    public:
    string addBinary(string a, string b)
    {
        string a1;
        auto i = a.find_first_of("01");
        if(i != string::npos)
        {
            auto j = a.find_first_not_of("01", i + 1);
            if(j == string::npos)
            {
                j = a.size();
            }
            a1.insert(a1.end(), a.begin() + i, a.begin() + j);
        }
        string b1;
        auto i1 = b.find_first_of("01");
        if(i1 != string::npos)
        {
            auto j1 = b.find_first_not_of("01", i1 + 1);
            if(j1 == string::npos)
            {
                j1 = b.size();
            }
            b1.insert(b1.end(), b.begin() + i1, b.begin() + j1);
        }
        //空字符
        if(a1.size() == 0 && b1.size() == 0) { return{}; }
        if(a1.size() == 0 || a1.find('1') == string::npos)
        {
            auto tem = b1.find('1');
            if(tem == string::npos)
            {
                return{ '0' };
            }
            return string(b1.begin() + tem, b1.end());
        }
        if(b1.size() == 0 || b1.find('1') == string::npos)
        {
            auto tem = a1.find('1');
            if(tem == string::npos)
            {
                return{ '0' };
            }
            return string(a1.begin() + tem, a1.end());
        }
        string res;
        int len1 = a1.size();
        int len2 = b1.size();
        int len3 = len1 > len2?len1:len2;
        res.reserve(len3);
        int carry = 0;
        --len1;
        --len2;
        while(len1 >= 0 && len2 >= 0)
        {
            int sum = a1[len1] - '0' + b1[len2] - '0' + carry;
            if(sum > 1)
            {
                res.push_back((sum % 2) + '0');
                carry = 1;
            }
            else
            {
                res.push_back(sum + '0');
                carry = 0;
            }
            --len1;
            --len2;
        }
        while(len1 >= 0)
        {
            int sum = a1[len1] - '0' + carry;
            if(sum > 1)
            {
                res.push_back((sum % 2) + '0');
                carry = 1;
            }
            else
            {
                res.push_back(sum + '0');
                carry = 0;
            }
            --len1;
        }
        while(len2 >= 0)
        {
            int sum = b1[len2] - '0' + carry;
            if(sum > 1)
            {
                res.push_back((sum % 2) + '0');
                carry = 1;
            }
            else
            {
                res.push_back(sum + '0');
                carry = 0;
            }
            --len2;
        }
        if(carry) { res.push_back('1'); }
        auto lt = res.rfind('1');
        auto zeros = res.size() - lt - 1;
        return string(res.rbegin() + zeros, res.rend());
    }
};
2、別人的程序

這裏有許多技巧。位操作;提前分配空間,方便插入;3操作合一;頭插變尾插。

class Solution
{
    public:
    string addBinary(string a, string b)
    {
        string s;
        s.reserve(a.size() + b.size());
        int c = 0, i = a.size() - 1, j = b.size() - 1;
        while(i >= 0 || j >= 0 || c == 1)
        {
            c += i >= 0 ? a[i--] - '0' : 0;
            c += j >= 0 ? b[j--] - '0' : 0;
            
//s = char(c % 2 + '0') + s;     //this can run, but time complex is great
s.push_back((c & 1) + '0');
            c >>= 1;
        }
        reverse(s.begin(), s.end());
        return s;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章