For example,
a = "11"
b = "1"
Return "100".
问题描述:给定两个表示二进制的字符串,返回它们的和。
如上例所示,将字符串的值解释为二进制,然后进行相加,返回和。
可以采用加法器中的原理,依次遍历两个字符串,将相应位相加,然后使用一个整型值表示后面向该位的进位,计算本位的值以及向前面的进位值。当有一个字符串遍历完成之后,还需要遍历另外一个字符串,依据类似的原理将剩余的位计算完成,最后,如果进位值还是为1,则再在和前面添加1。
当然,还有更加简单的方法,这里也是为了锻炼反向迭代器的使用。
class Solution {
public:
string addBinary(string a, string b) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(a.size() == 0)
return b;
if(b.size() == 0)
return a;
string sum;
int ain = 0, now = 0, tmp = 0;
string::reverse_iterator a_riter = a.rbegin(), b_riter = b.rbegin();
for(; a_riter != a.rend() && b_riter != b.rend(); ++a_riter, ++b_riter) {
tmp = *a_riter-48+*b_riter-48+ain;
now = tmp % 2;
if(tmp / 2) {
ain = 1;
}
else {
ain = 0;
}
sum.insert(sum.begin(), 1, now+48);
}
if(a_riter == a.rend() && b_riter != b.rend()) {
while(b_riter != b.rend() && ain == 1) {
tmp = *b_riter-48+ain;
now = tmp % 2;
if(tmp / 2) {
ain = 1;
}
else {
ain = 0;
}
sum.insert(sum.begin(), 1, now+48);
++b_riter;
}
if(b_riter != b.rend()) {
sum.insert(sum.begin(), b.rend().base(), b_riter.base());
}
}
if(b_riter == b.rend() && a_riter != a.rend()) {
while(a_riter != a.rend() && ain == 1) {
tmp = *a_riter-48+ain;
now = tmp % 2;
if(tmp / 2) {
ain = 1;
}
else {
ain = 0;
}
sum.insert(sum.begin(), 1, now+48);
++a_riter;
}
if(a_riter != a.rend()) {
sum.insert(sum.begin(), a.rend().base(), a_riter.base());
}
}
if(ain) {
sum.insert(sum.begin(), 1, '1');
}
return sum;
}
};