Leetcode 编程训练

Leetcode 编程训练

LeetCodeLogo (1)Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Facebook、Amazon之类的这些公司,基本上是应试教育的功利主义。

我做这些题目的不是为了要去应聘这些公司,而是为了锻炼一下自己的算法和编程能力。因为我开始工作的时候基本没有这样的训练算法和编程的网站,除了大学里的“算法和数据结构”里的好些最基础最基础的知识,基本上没有什么训练。所以,当我看到有人在做这些题的时候,我也蠢蠢欲动地想去刷一下。

于是,我花了3-4个月的业余时间,我把Leetcode的154道题全部做完了。(这也是最近我没有太多的时间来写博客的原因,你可以看到我之前做的那个活动中有几个算法题来自于Leetcode)有人说我时间太多了,这里声明一下,我基本上都是利用了晚上10点以后的时间来做这些题的。

LeetCode的题大致分成两类:

1)基础算法的知识。这些题里面有大量的算法题,解这些题都是有套路的,不是用递归(深度优先DFS,广度优先BFS),就是要用动态规划(Dynamic Programming),或是拆半查找(Binary Search),或是回溯(Back tracing),或是分治法(Divide and Conquer),还有大量的对树,数组、链表、字符串和hash表的操作。通过做这些题能让你对这些最基础的算法的思路有非常扎实的了解和训练。对我而言,Dynamic Programming 是我的短板,尤其是一些比较复杂的问题,在推导递推公式上总是有思维的缺陷(数学是我的硬伤),通过做了这些题后,我能感到我在DP的思路上有了很大的收获。

2)编程题。比如:atoi,strstr,add two num,括号匹配,字符串乘法,通配符匹配,文件路径简化,Text Justification,反转单词等等,这些题的Edge Case, Corner Case有很多。这些题需要你想清楚了再干,只要你稍有疏忽,就会有几个case让你痛不欲生,而且一不小心就会让你的代码会写得又臭又长,无法阅读。通过做这些题,可以非常好的训练你对各种情况的考虑,以及你对程序代码组织的掌控(其实就是其中的状态变量)。还记得我在《函数式编程》中说的,程序中的状态是你程序变得复杂难维护的直接原因。

我觉得每个程序员都应该花时间和精力做这些题,因为你会从这些题中得到很大的收益。做完这些题后你一定会明白下面几个道理:

1)想清楚了再干。这个观点我以前就在《多些时间可以少些代码》说过。如果你拿到题就上去直接写代码的话,你一定会被各种case打回来了。然后呢,你一着急,你就会进入那种我在《开发团队的效率》中说的那种毫无效率case by case的开发模式,而你也进入了“平庸模式”。于是你就会出现下图那样的情况。

Case-by-Case Developement
Case-by-Case Development

2) 编程是脑力劳动,急不得。这个事情在这做这些题的时候你就会发现,要么是脑子转不过来了,要么就是明明就差一点了,但程序怎么都调不对。如果你越着急的话,你就会发现你会离目标越远,而花的时间也会更多。另外,你会发现这些题基本上都是50行代码内就可以搞定的,但是为了这50行以内的代码,你要花好多时间和精力。coding  50行代码在我们的日常工作中分分钟就完成,而Leetcode里的50行代码却没那么简单,也许,用这个你就可以区别什么是码农,什么是程序员了。

3)加班要不得。因为我总是在晚上10点以后做题,所以,基本上都是在加班状态中工作。这种状态过上两三天,你就会发现,整个大脑已经不转了,而且不但不转,还会犯很多低级错误,很多事情都想不清楚,一个晚上都在和程序的状态控制做搏斗,代码写得越来越乱,越来越没条理。于是这种时候,我都会休息几天,不做题了,然后再做题的时候,就觉得非常地清楚。可见加班 是编程最致命的敌人!

我把我的C++代码放到了Github上,大家也帮我review一下,看看有没有可以改善的。

https://github.com/haoel/leetcode

好了,不多说了,我希望大家有时间都去练练LeetCode,无论是找工作还是对你的编程能力会有非常大的提高

 

(全文完)

(转载本站文章请注明作者和出处 宝酷 – sou-ip ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (111 人打了分,平均分: 4.47 )
Loading...

Leetcode 编程训练》的相关评论

  1. Leetcode 名气大点,不知道 Project Euler:https://projecteuler.net 这个跟它比较起来怎么样?

  2. 题目居然都有分级别了,不过我感觉分级标准不科学啊,我死活刷不出来的7道题好像还基本都是medium

  3. Maximum Product Subarray 这道题貌似不对

    如果测试 数组是 {-5,-4,0,-3,2,3} 得出结果是20

  4. 毕业季找工作的时候刷过一些题,没做完,有些题目还是很有挑战性的,没想到耗子哥也在做这些题呀

  5. Pingback: Leetcode 编程训练
  6. “还有大量的对树,数组、链表、字符串和hash表的操作。”——第一个逗号应该是顿号吧。。。

  7. 的确,很赞同博主的各种观点,同时文章也做的很人性化,图文并茂不至于太枯燥,还有加粗标记重点说明,如果浩哥将来出书的话,我肯定去买~其实关注很久了,一直没说话,嘿嘿

  8. @James Xu
    Leetcode和SPOJ是纯正的编程测试,会涉及更多算法和数据结构的东西;ProjectEuler更偏数学一些,而且只关心结果。

  9. 真是雪中送炭的一个帖子,能直接学习耗子叔的代码和思路,这种机会真是太难得了

  10. 多谢耗子哥,我也准备学学算法,重拾《算法导论》。指出一个错别字,“拆半查找”中的拆,应该用了五笔打字,是手误

  11. char str[100];
    char* removeNoise(char* s)
    {
    	int len=strlen(s);
    //	 char str[len];
    	int j=0;
    	int i=0;
    	for(;i<len-1;i++){
    		if(isalpha(s[i])){
                str[j]=tolower(s[i]);
    			j=j+1;
    		}
    		str[j]='';
    	}
    	return str;
    }
    int main()
    {
        char*s="chu,xi;nXi0n1";
        char* xx=NULL;
        xx=removeNoise(s);
        printf("%s",xx);
    
    }
    

    用char str[100];的话就只能是100字节的长度,我想要不定长的,我想把// char str[len];注释掉的这个启用,但是由于是局部变量那么返回就会乱码,有什么办法么?

  12. 问个问题,B类地址中 网络号为128.0的地址是否可用?如果不可,那它是有什么特殊用途吗?我在网上是真的搜不到答案了,来这里问下。谢谢。

  13. 看YouTube视频一点都不卡,Google资料,下代码,专门针对性优化线路,免费试用,百度搜懂你加速器

  14. 奇怪,Two Sum這道題,我這樣寫:
    結果它說我[0, 4, 3, 0], 0過不了:我的程序給出3, 2,而答案是1, 4
    但我在家裡怎麼試,我的程序也是給出1, 4呀?

    #include <iostream>
    #include <vector>
    #include <unordered_map>
    using namespace std;
    
    class Solution {
    public:
        vector<int> twoSum(vector<int> &numbers, int target) {
            unordered_map<int, int> matcher;
            vector<int> solution;
            int size = numbers.size();
            for (int i = 0; i < size; ++i) {
                int needed = target - numbers[i];
                auto index = matcher.find(needed);
                if (index == matcher.end()) {
                    matcher[numbers[i]] = i;
                } else {
                    cout << index->second + 1 << ", " << i + 1 << endl;
                    solution.push_back(index->second + 1);
                    solution.push_back(i + 1);
                    break;
                }
            }
            return solution;
        }
    };
    
  15. 最近看到一个题是讲手机九宫格解锁的,1—9个数字,只能选其中6个作为密码,不能重复,注意:数字不能跳跃,如1不能直接到9,1也不能直接到3。计算并打印出这些密码。有谁能接下这题吗,谢了!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注