题目
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例
- 示例 1:
输入: a = “11”, b = “1”
输出: “100” - 示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
C++代码
首先判断两个字符串的长短,以短的为准,从后往前逐个对两个字符串的元素进行判断。设置temp储存进位符,为1则进位。
此外还要注意string中的元素为char型,所以里边的数字对应的是其ASCII码,比较时要进行转换,0对应的ASCII码是48
class Solution {
public:
string addBinary(string a, string b)
{
string sum = "";
int m = a.length();
int n = b.length();
string smax,smin;
int max, min;
if (m>n)
{
max = m;
min = n;
smax = a;
smin = b;
}
else
{
max = n;
min = m;
smax = b;
smin = a;
}
int temp = 0; //进位符
int i = max - 1;
int j = min - 1;
while (j >= 0) //以短的字符串为准进行循环
{
temp = temp / 2 + smax[i] + smin[j]-96;
sum = to_string(temp % 2) + sum;
i--;
j--;
}
if (i - j) //如果两个字符串不等长
{
for (int k = i; k >= 0; k--)
{
temp = smax[k] + temp / 2 - 48;
sum = to_string(temp % 2) + sum;
}
}
if (temp/2) sum = to_string(temp / 2) + sum; //字符串的首位,判断是否进位
return sum;
}
};
另外一种想法(有弊端),将两个字符串转换成int型,然后直接相加,可以预料到和当中每一位数只可能是0,1,2,然后再将和转换成string从后往前进行逐位判断,若该位加上进位符后大于等于2,则进位,进位后该位上的元素为其除以2的商。
但是,int型表示的变量是有大小限制的([-2^31, 2 ^31 -1] ),所以当超出限制时,就会报错。。。当然也可以使用unsigned int,不过无论如何以避免不了超出限制的问题。。。
class Solution {
public:
string addBinary(string a, string b)
{
int tempa = stoi(a);
int tempb = stoi(b);
int tempsum = tempa + tempb;
string sum = to_string(tempsum);
int n = sum.length();
int temp; //进位符
string result = to_string((sum[n - 1] - 48) % 2);
if (sum[n - 1] - 48 == 2) temp = 1;
else temp = 0;
for (int i = n - 2; i >= 0; i--)
{
result = to_string((sum[i] - 48 + temp) % 2) + result;
if (sum[i] - 48 + temp >= 2) temp = 1;
else temp = 0;
}
if(temp) result= to_string(temp % 2) + result;
return result;
}
};