给你两个二进制的字符串,返回它们的和(以二进制的形式)。
输入的字符串都是非空的,并且至少包含一个0或1
1. 常规思路
这样会出错,当字符串a、b过长的时候。
public String addBinary(String a, String b)
{
long aa = Integer.parseInt(a, 2);
long bb = Integer.parseInt(b, 2);
return Long.toString(aa+bb, 2);
}
2. 从后向前计算每一个字符相加的结果,考虑进位
public String addBinary(String a, String b)
{
int carry = 0; // 进位
int len1 = a.length()-1;
int len2 = b.length()-1;
int num1 = 0;
int num2 = 0;
StringBuffer sBuffer = new StringBuffer();
while (len1 >= 0 && len2 >= 0)
{
num1 = a.charAt(len1) - '0';
num2 = b.charAt(len2) - '0';
if (num1 + num2 + carry >= 3)
{
carry = 1;
sBuffer.append(1);
}
else if (num1 + num2 + carry >= 2)
{
carry = 1;
sBuffer.append(0);
}
else
{
sBuffer.append(num1 + num2 + carry);
carry = 0;
}
len1--;
len2--;
}
// 如果字符串a还没有计算完
while (len1 >= 0)
{
num1 = a.charAt(len1) - '0';
num1 += carry;
if (num1 >= 2)
{
carry = 1;
sBuffer.append(0);
}
else
{
carry = 0;
sBuffer.append(num1);
}
len1--;
}
// 如果字符串b还没有计算完
while (len2 >= 0)
{
num2 = b.charAt(len2) - '0';
num2 += carry;
if (num2 >= 2)
{
carry = 1;
sBuffer.append(0);
}
else
{
carry = 0;
sBuffer.append(num2);
}
len2--;
}
// 产生了进位
if (carry == 1)
{
sBuffer.append(1);
}
return sBuffer.reverse().toString();
}