码迷,mamicode.com
首页 > 其他好文 > 详细

OJ练习18——T67 Add Binary

时间:2015-04-17 09:33:59      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

把以字符串表示的两个二进制数相加。

【思路】

活学活用昨天学到的reverse。将倒序相加变成正序相加。

但这样的话,就要用到三个reverse,两个原串,最后还要把结果翻转。

可能对速度有影响,经测试,好像还比不翻转快一点点。

一个point是,两串长度不同,一串加完了另一串怎么办?

我的办法是将其视为0,这样就能统一为 a[i]+b[i]+flag的形式。

【my code】

string addBinary(string a, string b) {
    string c="";
    int i, j;
    int aa,bb;
    int flag=0;
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    for(i=0; i<a.size()||i<b.size(); i++)
    {
        if(i<a.size()&&i<b.size()){
            aa=a[i]-0;
            bb=b[i]-0;
        }
        else if(i>=a.size()){
            aa=0;
            bb=b[i]-0;
        }
        else if(i>=b.size()){
            bb=0;
            aa=a[i]-0;
        }
        if(aa+bb+flag>2){
            c.push_back(1);
            flag=1;
        }
        else if(aa+bb+flag>1){
            c.push_back(0);
            flag=1;
        }
        else if(aa+bb+flag>0){
            c.push_back(1);
            flag=0;
        }
        else{
            c.push_back(0);
            flag=0;
        }
    }

    if(flag==1)
        c.push_back(1);
    reverse(c.begin(), c.end());
    return c;

}

【other code】

class Solution {
public:
    string addBinary(string a, string b) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int flag = 0;
        
        int aIndex = a.size() - 1;
        int bIndex = b.size() - 1;
        
        string c;
        
        while(aIndex >= 0 && bIndex >= 0)
        {
            int num = a[aIndex] - 0 + (b[bIndex] - 0) + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + 0) + c;
            
            aIndex--;
            bIndex--;
        }
        
        while(aIndex >= 0)
        {
            int num = a[aIndex] - 0 + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + 0) + c;
            
            aIndex--;
        }
        
        while(bIndex >= 0)
        {
            int num = b[bIndex] - 0 + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + 0) + c;
            
            bIndex--;
        }
        
        if (flag > 0)
            c = (char)(flag + 0) + c;
            
        return c;
    }
};

【评价】

1.用string的“+”操作可以将两个串按自己想要的顺序连接,这样就把新的结果放在前面,再连上以前的结果,最后不需要翻转。

这个技巧要学会。

2.flag=num/2;

num%=2;

两句话就表明了我for中的一大坨,两者结合,代码就更短啦!

【郑重声明】

每篇文章的other code皆是百度直接搜索题目的结果,大部分来自remolostime的博客园,地址是:

http://www.cnblogs.com/remlostime/tag/LeetCode/

向前辈致敬。

OJ练习18——T67 Add Binary

标签:

原文地址:http://www.cnblogs.com/ketchups-notes/p/4433968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!