LeetCode题目之67

题目描述如下:

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 查看本文章
发布了9 篇原创文章 · 获赞 0 · 访问量 1331

猜你喜欢

转载自blog.csdn.net/qq_41645895/article/details/102641803