给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
//先补齐较短串,相应元素相加分为四种情况+flag,另外单独考虑最后进位。
class Solution {
public:
string addBinary(string a, string b) {
string s="";
int i,j,flag=0;
for (i=a.size()-1,j=b.size()-1;i>=0||j>=0;i--,j--){
if(j<0){b.insert(0,"0");j=0;}
if(i<0){a.insert(0,"0");i=0;}//补齐
switch((a[i]-'0')+(b[j]-'0')+flag){
case 3:
flag=1;
s.insert(0,"1");
break;
case 2:
flag=1;
s.insert(0,"0");
break;
case 1:
flag=0;
s.insert(0,"1");
break;
case 0:
s.insert(0,"0");
flag=0;
break;
}
}
if(flag==1) s.insert(0,"1");
return s;
}
};
简洁写法:
class Solution
{
public:
string addBinary(string a, string b)
{
string s = "";
int c = 0, i = a.size() - 1, j = b.size() - 1;
while(i >= 0 || j >= 0 || c == 1)//循环直到i<0,j<0且进位=0
{
c += i >= 0 ? a[i --] - '0' : 0;//i=0 c+0
c += j >= 0 ? b[j --] - '0' : 0;//c=sum(a+b+进位);
s = char(c % 2 + '0') + s;//进位之后:0:sum=2/0;1:sum=1
c /= 2;// 表示进位 1:sum=2;0:sum=0/1
}
return s;
}
};