看到这个题目,一开始有点无从下手,我想的是从后往前去进行相加,但是很显然这样实现比较困难,那么我们为什么不
翻转这个字符串呢?这样不就是从后往前相加了吗。于是,第一版解答出来了。
题解
class Solution {
public:
string addBinary(string a, string b) {
// 翻转两个字符串
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int n = max(a.size(),b.size()),carry = 0;
string res;
for(int i=0;i<n;i++){
carry+= i<a.size()?(a.at(i)=='1'):0;
carry+= i<b.size()?(b.at(i)=='1'):0;
if(carry == 3){
res.append("1");
carry =1;
}
else if(carry == 2 ) {
res.append("0");
carry = 1;
}
else if(carry == 1){
res.append("1");
carry = 0;
}
else if(carry == 0){
res.append("0");
carry = 0;
}
}
if(carry){
res.append("1");
}
reverse(res.begin(),res.end());
return res;
}
};
但是,显然,中间的判断太过于冗长,并且,在第一次解答的过程中,我漏掉了 carry = 3 的情况。显然,这样并不好。于是,第二班版解答出现了。
class Solution {
public:
string addBinary(string a, string b) {
// 翻转两个字符串
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int n = max(a.size(),b.size()),carry = 0;
string res;
for(int i=0;i<n;i++){
carry+= i<a.size()?(a.at(i)=='1'):0;
carry+= i<b.size()?(b.at(i)=='1'):0;
if(carry%2==1) res.append("1");
else res.append("0");
carry/=2;
}
if(carry){
res.append("1");
}
reverse(res.begin(),res.end());
return res;
}
};
很容易看出,第一版我忘记了二进制的本质,那就是二的倍数,第二版的优化明显比第一版更加优雅,但是在LeetCode上的耗时和占用的空间更加的大。
结语
算法小白的算法笔记。
文章如果有不正确的地方,欢迎指正,共同学习,共同进步。
若有侵权,请联系作者删除。