408. 二进制求和

2018-09-04 13:18:56 浏览数 (1)

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

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

code:

代码语言:javascript复制
  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]);
        }
    }

0 人点赞