原题网址: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;
}
};