题目描述
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例1
示例2
题解思路
本题就是一个二进制求和,用C、C++语言求解主要在于处理字符与字符相加与进位的问题,那么从两个字符串的末端开始遍历,逐个字符相加,用 int 变量记录进位值,本题我构造了一个加法辅助函数,用于两个字符与进位值相加,返回一个进位值和结果字符(在辅助函数中用 int 类型的除法和取模实现),这样循环遍历直至完毕
代码
class Solution {
public:
//加法函数,返回结果字符,进位值使用引用参数传递
char add(char a,char b,int& carry)
{
int a1,b1;
a=='0'?a1=0:a1=1;
b=='0'?b1=0:b1=1;
int result;
result=(a1+b1+carry)%2;
carry=(a1+b1+carry)/2;
char ch;
ch=(result==0)?'0':'1';
return ch;
}
string addBinary(string a, string b) {
string ans;
int al = a.size()-1;
int bl = b.size()-1;
int carry = 0; //进位标志
//同时遍历a,b字符串
while(al>=0&&bl>=0)
{
char ch = add(a[al],b[bl],carry);
ans.push_back(ch);
al--;bl--;
}
//如果a串没遍历完
while(al>=0)
{
char ch = add(a[al],'0',carry);
ans.push_back(ch);
al--;
}
//如果b串没遍历完
while(bl>=0)
{
char ch = add('0',b[bl],carry);
ans.push_back(ch);
bl--;
}
//如果最后进位位为1
if(carry==1)
ans.push_back('1');
reverse(ans.begin(),ans.end());
return ans;
}
};