LeetCode 67:Add Binary (c++)

一:题目

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

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

二:解题分析

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

abc
000
011
101
110

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

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

a[i]b[i]ccarry
0000
0110
1010
1101

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值