LeetCode 67:Add Binary (c++)

来源:互联网 发布:学python书籍推荐 编辑:程序博客网 时间:2024/06/03 15:20

一:题目

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

二:解题分析

将只有'0,'1'的两个字符串进行二进制相加,即c代表a+b的结果

abc000011101110

1.把两个字符串从右向左遍历,进行加和,直到至少有一个字符串遍历完成为止。注意有进位。

该步骤以长度较短的字符串为基准,从他的高位开始计算,同时要考虑进位carry=0,无进位,carry=1,有进位

a[i]b[i]ccarry0000011010101101

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