Add Binary
Given two binary strings, return their sum(also a binary string).
For example,
a = "11"
b = "1"
Return "100".
二进制大家都知道,这题要求我们给定两个string形式的二进制数字,要我们做加法并返回一个string。
有看过我之前博客的看官还否记得21Merge Two Sorted Lists这题。我提到了加法,乘法,融合,合并,这一类的动词,使得参与运算的东西没有地位的差别,因此对我们算法的设计有影响。因此呢我们人为的设定主动被动关系。
加法,当然就设置加数和被加数。(融合、合并这类就设置插入与被插入)
这样就能因地制宜了。
怎么设置好呢。
以长的二进制数做被加数。因为,如果用短的做被加数,那么短的扫描完毕之后,还要把长的剩余的部分添加到短的中。我们要避免这样不必要的麻烦。
我们需要从后往前扫描字符串。
不管取谁做被加数,当短的那个数扫描完毕之后,还可能存在【进位】这个隐藏的加数,所以呢,如果还存在进位的话,还要继续往下算。 最后,如果被加数扫描完了(到最前面了),还存在进位,则需要插入一个‘1’。
前面做了plus one的题,进位的处理应该没问题了。
Leetcode的AcceptedSolutions Runtime Distribution(15-06-12)
源码:
#include <iostream>
#include <string>
using namespace std;
string addBinary(string a, string b);
int main(){
string res = addBinary("110010", "10111");
cout << " " << res;
return 0;
}
string addBinary(string a, string b){
if ("" == a) return b;
if ("" == b) return a;
string::iterator added;
string::iterator adding;
string::iterator iterBeginEd;
string::iterator iterBeginIng;
if (a.size() > b.size())
{
added = a.end();
iterBeginEd = a.begin();
adding = b.end();
iterBeginIng = b.begin();
}
else
{
added = b.end();
iterBeginEd = b.begin();
adding = a.end();
iterBeginIng = a.begin();
}
bool carry = false;
while (iterBeginIng != adding)
{
adding--;
added--;
if (('0' == *adding && '1' == *added) || ('1' == *adding && '0' == *added))//'0' + '1' || '1' + '0'
{
if (carry)
{
*added = '0';
carry = true;//冗余语句
}
else
{
*added = '1';
carry = false;//冗余语句
}
}
else if (('1' == *adding && '1' == *added))//'1' + '1'
{
if (carry) *added = '1';
else *added = '0';
carry = true;
}
else//'0' + '0'
{
if (carry) *added = '1';
else *added = '0';
carry = false;
}
}
//到这里,短的数,也就是加数已经扫描完毕了。如果有进位的话,才需要继续扫描被加数。我这里怒偷懒,一个while直接扫完了,肯定是多做无意义的事情了。读者自行修改吧
while (iterBeginEd != added)
{
added--;
if ('0' == *added)
{
if (carry) *added = '1';
else *added = '0';
carry = false;
}
else
{
if (carry)
{
*added = '0';
carry = true;//冗余语句
}
else
{
*added = '1';
carry = false;//冗余语句
}
}
}
if (carry)
{
if (a.size() > b.size()) a.insert(a.begin(), '1');
else b.insert(b.begin(), '1');
}
return a.size() > b.size() ? a : b ;
}