问题描述
给定两个二进制字符串,返回他们的和(用二进制表示)。
样例
a = 11
b = 1
返回 100
笔记
可以先把两个数reverse,然后在头部插入结果,也可以先在尾部插入结果,最后再把结果reverse,从代码简洁程度来看似乎第一种比较简洁。
要注意最后把carry加进去结果中。
代码
class Solution {
public:
/**
* @param a a number
* @param b a number
* @return the result
*/
string addBinary(string& a, string& b) {
// Write your code here
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string res;
int carry = 0;
int ia = 0;
int ib = 0;
int lena = int(a.size());
int lenb = int(b.size());
while (ia < lena || ib < lenb)
{
int nowa = (ia < lena) ? a[ia] - '0' : 0;
int nowb = (ib < lenb) ? b[ib] - '0' : 0;
int tmp = nowa + nowb + carry;
carry = tmp / 2;
res.insert(res.begin(), tmp % 2 + '0');
ia++;
ib++;
}
if (carry)
res.insert(res.begin(), '1');
return res;
}
};
第二次写又写出另外一种,思路还是差不多吧
class Solution {
public:
/**
* @param a a number
* @param b a number
* @return the result
*/
string addBinary(string& a, string& b) {
// Write your code here
const int lena = a.size();
const int lenb = b.size();
int ia = lena - 1;
int ib = lenb - 1;
int carry = 0;
string res;
while (ia >= 0 && ib >= 0)
{
int tmp = a[ia] - '0' + b[ib] - '0' + carry;
res.push_back(tmp % 2 + '0');
carry = tmp / 2;
ia --;
ib --;
}
while (ia >= 0)
{
int tmp = a[ia] - '0' + carry;
res.push_back(tmp % 2 + '0');
carry = tmp / 2;
ia --;
}
while (ib >= 0)
{
int tmp = b[ib] - '0' + carry;
res.push_back(tmp % 2 + '0');
carry = tmp / 2;
ib --;
}
if (carry)
res.push_back(carry + '0');
reverse(res.begin(), res.end());
return res;
}
};