这题思路蛮简单的。
【题目描述】
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
【示例】
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 ≤ a . l e n g t h , b . l e n g t h ≤ 1 0 4 1 \le a.length, b.length \le 10^4 1≤a.length,b.length≤104
字符串如果不是 “0” ,就都不含前导零。
【解答】
【思路】
先对特殊情况处理,比如一个字符串为空或+0的情况,直接返回另一个字符串,然后就先判断两个字符串的长度,长度不一先给短的前面补上0,便于遍历。然后就是二进制加法的逻辑了。注意再最后要加一个判断:如果要进位需要加上一个1.
【代码】
下面是最后通过的代码:
class Solution {
public:
string addBinary(string a, string b) {
if(a.length()==0 ||(a.length()==1 && a[0]=='0')){
return b;
}
else if(b.length()==0 || (b.length()==1 && b[0]=='0')){
return a;
}
int len1=a.length(),len2=b.length();
int len=len1;
int carry=0;
string ans="";
if(len1<len2){
len=len2;
for(int i=0;i<(len2-len1);i++){
a='0'+a;
}
}
else if(len1>len2){
len=len1;
for(int i=0;i<(len1-len2);i++){
b='0'+b;
}
}
int sum=0;
for(int j=len-1;j>=0;j--){
sum=(a[j]-'0')+(b[j]-'0')+carry;
if(sum==0){
ans='0'+ans;
carry=0;
}
else if(sum==1){
ans='1'+ans;
carry=0;
}
else if(sum==2){
ans='0'+ans;
carry=1;
}
else if(sum==3){
ans='1'+ans;
carry=1;
}
}
if(carry==1){
ans='1'+ans;
}
return ans;
}
};
耗时比较小,但是空间不太行,因为补了多余的0。