• 408 二进制求和


    原题网址:https://www.lintcode.com/problem/add-binary/description

    描述

    给定两个二进制字符串,返回他们的和(用二进制表示)。

    您在真实的面试中是否遇到过这个题?  

    样例

    a = 11

    b = 1

    返回 100

    标签
    二进制
    字符串处理
     
     
    思路1:直接按位相加,代码优化见:https://www.cnblogs.com/grandyang/p/5790441.html   大神就是大神,膜拜之
     
    代码:
    string addBinary(string &a, string &b) 
    {
        int sizea=a.size();
        int sizeb=b.size();
        int i=sizea-1,j=sizeb-1;
        int carry=0;
        string result="";
        while(i>=0||j>=0)
        {
            int p= i>=0?a[i--]-'0':0;
            int q= j>=0?b[j--]-'0':0;
            int sum=p+q+carry;
            carry=sum/2;
            sum=sum%2;
            result+=(sum+'0');
        }
        return carry==1?'1'+result:result;
    }
     
    原始代码……也是直接按位相加,注意进位的处理以及判断是否需要最后一次进位。最后将结果字符串翻转。
     
    AC代码:
    class Solution {
    public:
        /**
         * @param a: a number
         * @param b: a number
         * @return: the result
         */
        string addBinary(string &a, string &b) {
            // write your code here
        int sizea=a.size();
         int sizeb=b.size();
         if (sizea==0)
         {
             return b;
         }
         if (sizeb==0)
         {
             return a;
         }
         int i=sizea-1,j=sizeb-1;
         int carry=0;
         string result="";
    
         while(i>=0&&j>=0)
         {
             int sum=a[i]-'0'+b[j]-'0'+carry;
             carry=sum/2;
             sum=sum%2;
             result+=('0'+sum);
             i--;
             j--;
         }
         
             while(i>=0)
             {
                 int sum=a[i]-'0'+carry;
                 carry=sum/2;
                 sum=sum%2;
                 result+=('0'+sum);//int数字转char;
                 i--;
             }
        
             while(j>=0)
             {
                 int sum=b[j]-'0'+carry;
                 carry=sum/2;
                 sum=sum%2;
                 result+=('0'+sum);
                 j--;
             }
    
             if (carry==1)
             {
                 result+='1';
             }
             reverse(result.begin(),result.end());
             return result;
        
        }
    };

     

     

     

     
    思路2:将两个字符串转化成long long 型整数相加,再将和转化成 0、 1 字符串,注意要将字符串翻转。
    尤其注意两个字符串都为“0”时要单独处理。
     
    AC代码:
     
    class Solution {
    public:
        /**
         * @param a: a number
         * @param b: a number
         * @return: the result
         */
        string addBinary(string &a, string &b) {
            // write your code here
        int sizea=a.size();
         int sizeb=b.size();
         if (sizea==0)
         {
             return b;
         }
         if (sizeb==0)
         {
             return a;
         }
         long long num1=0,num2=0;
         for (int i=0;i<sizea;i++)
         {
             num1=num1+(a[i]-'0')*pow(2.0,sizea-i-1);
         }
         for (int i=0;i<sizeb;i++)
         {
             num2=num2+(b[i]-'0')*pow(2.0,sizeb-i-1);
         }
         num1=num1+num2;
         if (num1==0)//此处判断不可少,否则a、b都为“0”时返回错误结果;
         {
             return "0";
         }
         string result="";
         while(num1)
         {
             int tmp=num1%2;
             if (tmp==0)
             {
                 result=result+'0';
             }
             else
             {
                 result=result+'1';
             }
             num1=num1/2;
         }
         reverse(result.begin(),result.end());
         return result;
        }
    };
     
     
  • 相关阅读:
    JAVA软件开发职责
    Redis主从复制配置
    VirtualBox安装Ubuntu教程
    分段锁——ConcurrentHashMap
    阻塞队列BlockingQueue用法
    阻塞队列--LinkedBlockingQueue
    MySQL百万级数据库优化方案
    获取主机的对外ip
    联通沃云开启80端口
    Nginx 正则匹配
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9218923.html
Copyright © 2020-2023  润新知