Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
这道题最理想的状态时时间复杂度O(a.size()+b.size()),空间复杂度O(0)。
这道题中,我用两个引用added和add分别指向被加数和家数,这样可以省去很多不必要的判断;
然后用两个迭代器分别从字符串末尾向头部遍历。同时设置一个进位carry的变量表示有无进位。然后分情况讨论每一位的加法。
class Solution {
public:
string addBinary(string a, string b) {
string &added = a.size() >= b.size() ? a : b;
string &add = a.size() >= b.size() ? b : a;
bool carry = false;
string::iterator addedIt= added.end();
string::iterator addIt = add.end();
while (addIt != add.begin()){
if (!carry){
if (*(addedIt - 1) == '1'){
if (*(addIt - 1) == '1'){
*(addedIt - 1) = '0';
carry = true;
}
}
else{
if (*(addIt - 1) == '1'){
*(addedIt - 1) = '1';
}
}
}
else{
if (*(addedIt - 1) == '1'){
if (*(addIt - 1) == '0'){
*(addedIt - 1) = '0';
}
}
else{
if (*(addIt - 1) == '0'){
*(addedIt - 1) = '1';
carry = false;
}
}
}
addIt--;
addedIt--;
}
while (addedIt != added.begin()){
if (carry){
if (*(addedIt - 1) == '1'){
*(addedIt - 1) = '0';
}
else{
*(addedIt - 1) = '1';
carry = false;
}
}
addedIt--;
}
if (carry){
added.insert(0, "1");
}
return added;
}
};