67. Add Binary-Leetcode

我的AC方案

受到链表相加和上一题的影响,在原地对两个字符串进行相加并把结果存到a上 即可。

class Solution {
public:
    string addBinary(string a, string b) {
        int lena=a.size()-1;
        int lenb=b.size()-1;
        int r=0;
        while(lena>=0 &&lenb>=0)
        {
            a[lena]=a[lena]+(b[lenb]-'0')+r;
            if(a[lena]>='2')
            {
                a[lena]-=2;
                r=1;
            }
            else
                r=0;
            lena--;
            lenb--;
        }
        while(lena>=0)
        {
            a[lena]+=r;
            if(a[lena]>='2')
            {
                a[lena]-=2;
                r=1;
            }
            else
                r=0;
            lena--;
        }
        while(lenb>=0)
        {
            if(b[lenb]+r=='2')
            {
                a.insert(a.begin(),'0');
                r=1;        
            }
             else
             {
                 a.insert(a.begin(),b[lenb]+r);
                 r=0;  
             }
            lenb--;
        }
        if(r==1)
            a.insert(a.begin(),'1');
        return a;
    }
};

最优方案

最优方案一个大循环之后在内部判断,时间上所差无几。但是进位的表达方式采用位运算之前没有注意到这种表示方法carry = op1 & op2 | op1 & carry | op2 & carry

class Solution {
public:
    string addBinary(string a, string b) {
        string rs = "";
        int n1 = a.size(), n2 = b.size(), carry = 0;
        for (int i = n1 - 1, j = n2 - 1; i >= 0 || j >= 0; i--, j--) {
            int op1, op2;
            if (i >= 0) op1 = a[i] - '0';
            else op1 = 0;
            if (j >= 0) op2 = b[j] - '0';
            else op2 = 0;
            int sum = op1 ^ op2 ^ carry;
            rs = (char)(sum + '0') + rs;
            carry = op1 & op2 | op1 & carry | op2 & carry;
        }
        if (carry) rs = '1' + rs;
        return rs;
    }
    原文作者:analanxingde
    原文地址: https://www.jianshu.com/p/05aff275e86d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞