美文网首页lintcode
408. 二进制求和

408. 二进制求和

作者: 和蔼的zhxing | 来源:发表于2017-11-22 21:59 被阅读5次

给定两个二进制字符串,返回他们的和(用二进制表示)
样例
a = 11
b = 1
返回 100
非常惭愧还不是自己想来的算法,注意到几点:
1.数字字符减去‘0’可以得到其对应的int值。
2.可以先都加上(无非加上得到0,1,2)然后逐位进行进位处理.
下面的程序就是这样的一种思路,这里发现一个自己没注意的点,导致一些数据通过不了,如果是三种或三种以上互斥的情况,要用if-else语句的话中间都要用else if,因为else值匹配离其最近的if。比如

if (case 1)
    {---- ; }
if(case 2)
{------;}
else 
{------;}
//这里的else就可能包含了case1的情况,如果在if里面返回函数值可能还觉察不到这个问题,但是如果知识一般的判断和处理数据,这个问题就很严重。

code:

  string addBinary(string &a, string &b) {
       int size_a=a.size();
       int size_b=b.size();
       if(size_a<=0||size_b<=0)
       {
           return string();
       }
        resortString(a);   //重排字符串使得低位在前
        resortString(b);
        string res;   //存放结果
        int i=0;
        int carry=0; //进位标志
        for(i=0;i<size_a&&i<size_b;i++)  //把相同的位先加上
        {
            res+='0'+(a[i]-'0')+(b[i]-'0');   //前面的那个‘0’保证加完还是字符
            
        }
        for(;i<a.size();i++)
        {
            res+=a[i];
        }
        for(;i<b.size();i++)
        {
            res+=b[i];
        }
        //到这里就都加上了,加完以后每一位上可能是0,1,2.
        //下面要处理进位了,
        for(i=0;i<res.size();i++)
        {
            int temp=res[i]-'0'+carry;   
            //这里是不同的情况,进位之后可能是2,或者3,也可能是1,0
            if(temp==2)   //进位之后本位是0了
            {
                carry=1;
                res[i]='0';   
               
            }
            else if(temp==3)   //进位之后本位是1,这个else特别重要,如果是这种好几种情况的话一定要每次都加上else
            {
                carry=1;
                res[i]='1';
            }
            else{
                carry=0;
                res[i]=temp+'0';  //不进位,两种情况,tem=1或者0,直接赋值就可以
            }
        }
        if(carry==1)  //如果最后一位还有进位,那么再加上一个1
        {
            res+='1';
        }
        resortString(res);
        return res;
        
        // write your code here
        
    }
    
    void resortString(string &a)    //重排字符串
    {
        for(int i=0;i<a.size()/2;i++)
        {
            swap(a[i],a[a.size()-1-i]);
        }
    }

over

相关文章

  • 408. 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示)样例a = 11b = 1返回 100非常惭愧还不是自己想来的算...

  • [容易]408.二进制求和

    我是小小强,这是我的第6篇原创文章,阅读需要大约10分钟。 题目 LintCode:二进制求和 描述 给定两个二进...

  • 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。 示例 1:输入: ...

  • 二进制求和

  • 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入...

  • 二进制求和

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-...

  • 二进制求和

    LeetCode第67题 题目描述: 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且...

  • 二进制求和

    题目 难度级别:简单 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 ...

  • 二进制求和

    力扣67题 思路:类似力扣第二题,相加之后模(%)进制数获得当前位数的值,然后用相加之后的数除以进制数,获得进位的...

  • 408.有效单词缩写 Python指针思路分析与细节解析!

    408.有效单词缩写[https://leetcode-cn.com/problems/valid-word-ab...

网友评论

    本文标题:408. 二进制求和

    本文链接:https://www.haomeiwen.com/subject/zzzovxtx.html