我的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;
}