一:题目
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
二:解题分析
将只有'0,'1'的两个字符串进行二进制相加,即c代表a+b的结果
a | b | c |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1.把两个字符串从右向左遍历,进行加和,直到至少有一个字符串遍历完成为止。注意有进位。
该步骤以长度较短的字符串为基准,从他的高位开始计算,同时要考虑进位carry=0,无进位,carry=1,有进位
a[i] | b[i] | c | carry |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
2.此时应检查是否还有另一个字符串没有被遍历完。若发现存在则继续遍历。
3.遍历完两个字符串后,还需检查进位是否为 0,若进位不为 0,还要加上进位。即字符串c(求和后的字符串)长度等于最大的字符串长度或者最大字符串长度+1
4.最后将得到的和字符串反转,即为最后的结果(因为求和是从高位开始,a,b高位求和的结果,保存在c 的低位)
三:代码实现
class Solution {
public:
string sum(string a,string b)
{
string c;
int minLen=b.length();
int diff=a.length()-b.length();
char carry='0';
int numOfOne;
int i;
//从字符串的高位,一次相加
for(i=minLen-1;i>=0;i--){
numOfOne=0;
//统计a[i],b[i],carry中1的个数
if(a[i+diff]=='1')
numOfOne++;
if(b[i]=='1')
numOfOne++;
if(carry=='1')
numOfOne++;
if(numOfOne==0){
c+='0'; carry='0';
}
if(numOfOne==1){
c+='1'; carry='0';
}
if(numOfOne==2){
c+='0'; carry='1';
}
if(numOfOne==3){
c+='1'; carry='1';
}
}//for
//计算字符串a剩余位的结果
for(i=diff-1;i>=0;i--){
if(a[i]=='0' && carry=='0'){
c+='0';carry='0';
}
if(a[i]=='0' && carry=='1'){
c+='1';carry='0';
}
if(a[i]=='1' && carry=='0'){
c+='1';carry='0';
}
if(a[i]=='1' && carry=='1'){
c+='0';carry='1';
}
}
if(carry=='1')
c+='1';
return c;
}
string addBinary(string a, string b) {
string c,d;
int i;
bool flag=true; //字符串a更长
if(a.length()<b.length()){
flag=false;
}
//字符串a的长度大于b的长度
if(flag)
c=sum(a,b);
else
c=sum(b,a);
//反转字符串c
for(i=c.length()-1;i>=0;i--)
d+=c[i];
return d;
}
};