408 二进制求和

Posted tang-tangt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
};

 

 
 

以上是关于408 二进制求和的主要内容,如果未能解决你的问题,请参考以下文章

408. Add BinaryLintCode java

二进制求和

LeetCode67-二进制求和(很长的水题)

简单模拟二进制求和

以下代码片段的算法复杂度

408计算机组成原理—原码反码补码移码