力扣——两数之和

Posted 落霞与孤鹜亓飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣——两数之和相关的知识,希望对你有一定的参考价值。

两数之和

来自力扣上面的一道简单题,我很轻松的做出来了。
按照这道题目的难度来说,没有必要单独写博客记录这道题目。但是今天我做完这道题之后,突然发现我在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道题,每天进步或许非常微小,小到都不能感知,有时候我也会自我怀疑这样到底是否有用?即使如此,我依然没有放弃,直到今天,我看到了以前做题的记录,我终于知道我进步很大!

每天的努力,虽然进步很小,但是只要都坚持,经年累月下的练习就会取得很大的进步。对巨大成功进行分割,最后到的是那些每天不起眼的努力!不要轻易放弃自己的努力,不要因为没有感知到进步而放弃进取之心,经年累月下的累积,所有的努力最终会汇入成功的海洋!

谨以此文勉励自己,坚持刷题,坚持进步,坚持进取!

以上是关于力扣——两数之和的主要内容,如果未能解决你的问题,请参考以下文章

力扣——两数之和

力扣——两数之和

力扣题解 1th 两数之和

力扣 —— Two Sum ( 两数之和) python实现

力扣1. 两数之和

力扣01两数之和Java版