这题在Leetcode被标为容易题,我觉得并不那么容易,或许列为中等难度比较合适。
需要注意的地方有:
1) 不能把string按二进制map成integer,然后硬加,最后又从integer map回string。那样100%会overflow。我用unsigned long long也是一样。
2) 如果用到了 i=a.size(), i--; if (i-->=0) 这样的判断,那么i绝对不能定义为size_t,因为size_t是unsigned, 永远都>=0!
3) string可以直接跟char相加。
4) 注意两个数都遍历完了但是carry flag还在,那么需要c+='1',不然11+1就变成00了。
5) 注意string.append(),string.push_back()和string+的区别?好像不太一样,下次要细查。
6) Leetcode的solution中还有更简洁的解法,下次记得学习。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string addBinary(string a, string b) {
while (!a.size()) return b;
while (!b.size()) return a;
string c;
int i=a.size()-1, j=b.size()-1;
unsigned int cc=0, carryFlag=0;
while(i>=0 || j>=0) {
if ((i>=0)&&(j>=0)) {
cc=(a[i]-'0')+(b[j]-'0');
i--; j--;
}else if (i>=0) {
cc=(a[i]-'0');
i--;
}else if (j>=0) {
cc=(b[j]-'0');
j--;
}
cc+=carryFlag;
carryFlag=(cc>=2);
c+='0'+(cc&0x1);
}
if (carryFlag) c+='1';
reverse(c.begin(), c.end());
return c;
}
int main()
{
string a="111";
string b="11";
cout<<addBinary(a,b)<<endl;
a="0";
b="0";
cout<<addBinary(a,b)<<endl;
a="10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101";
b="110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011";
cout<<addBinary(a,b)<<endl;
return 0;
}