来自力扣上面的一道简单题,我很轻松的做出来了。
按照这道题目的难度来说,没有必要单独写博客记录这道题目。但是今天我做完这道题之后,突然发现我在2年前、1年前个月前已经做过这道题目,我很好奇我当时写的代码怎么样,我这2年代码能力是不是有进步?怀着这个心情,我点开了2年前、1年前的题解。
2年前我做这道题目的题解:
class Solution {
public:
string addBinary(string a, string b) {
string rslt ="";
bool over_flow = false;
int i,j;
for(i = a.size()-1,j = b.size()-1;i>=0&&j>=0;--i,--j){
if(!over_flow){
if(a[i]=='1'&&b[j] == '1'){
rslt.insert(rslt.begin(),'0');
over_flow=true;
}
else
rslt.insert(rslt.begin(),max(a[i],b[j]));
}
else{
if(a[i]=='0'&&b[j] == '0'){
rslt.insert(rslt.begin(),'1');
over_flow=false;
}
else{
rslt.insert(rslt.begin(),min(a[i],b[j]));
over_flow=true;
}
}
}
if(i>=0||j>=0){
string tmp("");
if(i>=0)
tmp.assign(a.begin(),a.begin()+i+1);
else
tmp.assign(b.begin(),b.begin()+j+1);
if(!over_flow)
rslt = tmp+rslt;
else{
int j;
for(j = tmp.size()-1;j>=0;--j){
if(tmp[j]=='1')
tmp[j] = '0';
else if(tmp[j]=='0') {
tmp[j] = '1';
break;
}
}
rslt= string(j>=0?"":"1") + tmp + rslt;
}
}
else if(over_flow)
rslt = "1"+rslt;
return rslt;
}
};
10个月前,我做这道题的题解如下:
class Solution {
public:
string addBinary(string a, string b) {
char up = '0';
if(a.size()<b.size())
a = string(b.size()-a.size(), '0')+a;
else if(b.size() < a.size())
b = string(a.size()-b.size(), '0')+b;
string ans(a.size(), '0');
int i = a.size()-1;
int j = b.size()-1;
while(i>=0 && j >=0){
if(a[i] =='0'&& b[j] == '0')
{
ans[i] = up;
up = '0';
}
else if(a[i] == '0'&& b[j] == '1' || a[i] == '1'&& b[j]=='0'){
if(up == '0')
ans[i] = '1';
else{
ans[i] = '0';
up = '1';
}
}
else{
if(up == '0'){
up = '1';
ans[i] = '0';
}
else{
up = '1';
ans[i] = '1';
}
}
i--;
j--;
}
if(up == '1') ans.insert(ans.begin(), up);
return ans;
}
};
今天,我的题解如下:
class Solution {
public:
string addBinary(string a, string b) {
int i = a.size()-1;
int j = b.size()-1;
string& ans = a.size()>b.size() ? a: b;
int remain = 0; // 进位数
int sum = remain; // 相同位置相加后的和
while(i>=0 || j>=0 || remain){
sum = remain;
sum += (i>=0) ? (a[i] - '0'): 0;
sum += (j>=0) ? (b[j] - '0'): 0;
remain = sum/2;
sum = sum%2;
if(i>=0 || j>=0)
ans[max(i, j)] = sum + '0';
else
ans.insert(ans.begin(), sum +'0');
i--;
j--;
}
return ans;
}
};
对三个题解进行比较,一眼就能看出来什么是好的代码,什么是烂代码,2年前我写个简单题都写的费劲,毫无注释,代码读起来非常晦涩难懂;到了今天,能够轻松地解决这道题目还能附加简单明了的注释,这确实说明我在编程方面有了很大进步,我不由得感慨起来,量变引起质变。
曾几何时,我在LeetCode上刚开始做题的时候,那时候一道简单的题目,我可能做3个小时,甚至一个下午都搞不定,只能在IDE的帮助下一点点的找bug,最后以一大串又臭又长的提交代码通过。虽然通过,但是我内心仍然非常难受,为什么明明是简单级别的题目,我做的却这么费劲,我为什么这么差劲?
算法如此之重要,我却总是不开窍,对别人来说非常简单的算法题,我要费半天劲才能调试出来,中等难度的题目,更是不敢想象,简直难如登天。我终于得出结论,我太笨了,没有别的办法,只能拼命练于是从2018年6月开始,我断断续续坚持练习算法题,2019年开始中断一阵,2019年8月开始,我又开始继续练习,我决定每天至少做2道题,那时候我还很弱鸡,我决定先把力扣所有的简单题目做完。牛逼的同学很奇怪为什么我每天都在刷一些简单题目,觉得这些没有意义,认为这是在浪费时间。他们是对的,简单题确实对他们来说意义不大,但是它们却对我意义重大,我每天就做那么2~3道题,每天进步或许非常微小,小到都不能感知,有时候我也会自我怀疑这样到底是否有用?即使如此,我依然没有放弃,直到今天,我看到了以前做题的记录,我终于知道我进步很大!
每天的努力,虽然进步很小,但是只要都坚持,经年累月下的练习就会取得很大的进步。对巨大成功进行分割,最后到的是那些每天不起眼的努力!不要轻易放弃自己的努力,不要因为没有感知到进步而放弃进取之心,经年累月下的累积,所有的努力最终会汇入成功的海洋!
谨以此文勉励自己,坚持刷题,坚持进步,坚持进取!