• OJ练习18——T67 Add Binary


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

    【思路】

    活学活用昨天学到的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/

    向前辈致敬。

  • 相关阅读:
    百度云BaaS体系揭秘,突破共识机制、单机计算和串行处理三大瓶颈
    百度云BaaS体系揭秘,突破共识机制、单机计算和串行处理三大瓶颈
    硬件笔试面试题
    硬件笔试面试题
    硬件笔试面试题
    hadoop生态搭建(3节点)-01.基础配置
    hadoop生态搭建(3节点)-01.基础配置
    Java Web开发中路径问题小结
    JavaScript 对象分类
    JavaScript 对象分类
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4433968.html
Copyright © 2020-2023  润新知