题目描述如下:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
个人思路:
我的思路就是最简单的我们用笔算二进制加法的思路,让两个数尾端对齐,然后设置一个临时变量用作为判断上一轮加法中是否有进位。然后以从尾端开始遍历的方式开始来进行遍历,循环次数是其中较短的字符串的长度。
遍历完成之后,我们就需要处理比较长的一个字符串中还没有进行相加的数,这个时候就把还没有处理的数与进位进行相加,方法类似于之前的循环。
代码:
string addBinary(string a, string b) {
string sum("");
bool flag = false; //标志是否需要进位
int i,j; //记录下标
for(i = a.length() - 1, j = b.length() - 1; i >= 0 && j >= 0; --i, --j){
if(a[i] != b[j]) {//不相等则相加必为1,然后再处理进位
if(flag) {//有进位则结果为2,置进位为1,添0
flag = true;
sum.append("0");
}
else {//无进位则结果为1,置进位为0,添1
flag = false;
sum.append("1");
}
}
else if(a[i] == '1'){//相等且为2
if(flag) {//有进位则结果为3,置进位为1,添1
flag = true;
sum.append("1");
}
else {//无进位则结果为2,置进位为1,添0
flag = true;
sum.append("0");
}
}
else{
if(flag) {//有进位则结果为1,置进位为0,添1
flag = false;
sum.append("1");
}
else {//无进位则结果为0,置进位为0,添0
flag = false;
sum.append("0");
}
}
}
while(i-- >= 0 && flag){ //若a有剩余则依次与进位相加,当无进位时只需要把剩下的字符串直接接在前端即可
if(a[i+1] == '1') sum.append("0");
else {
sum.append("1");
flag = false;
}
}
while(j-- >= 0 && flag){//若b有剩余则依次与进位相加,此while循环与上一个while循环只会执行一个
if(b[j+1] == '1') sum.append("0");
else {
sum.append("1");
flag = false;
}
}
if(flag) sum.append("1"); //判断最前端是否还有进位,如果有的话再加1,如果执行了这一步下面的判断语句则不会执行
reverse(sum.begin(),sum.end()); //上面的计算存储是一个小端存储,因此需要反转字符串
if(i+1 >= 0){
sum = a.substr(0,i+2) + sum;
}
else if(j+1 >= 0){
sum = b.substr(0,j+2) + sum;
}
return sum;
}
扫描二维码关注公众号,回复:
8964641 查看本文章