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,无论是找工作还是对你的编程能力会有非常大的提高

 

(全文完)


关注CoolShell微信公众账号可以在手机端搜索文章

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

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (74 人打了分,平均分: 4.78 )
Loading...

Leetcode 编程训练》的相关评论

  1. 你好,谢谢您分享的leetcode的解题思路,我在看您的解题的时候,注意到您在题目《Intersection of Two Linked Lists》中对一个私有函数int getlistLength()进行了内联处理,即:

    inline int getListLength(ListNode *head){
        int len=0;
        while(head!=NULL){
             head = head->next;
             len++;
        }
        return len;
    }

    自己学习c++的时候,看到很多资料都说如果函数内有循环体的不建议使用内联的方式处理,因为即使有inline关键字,编译器也会把该函数作为非内联函数处理。请问博主解决这个问题时是怎么思考的?还是笔误?

  2. @陈皓
    我也是在学习的时候在一些程序员的博客(并非权威)里面看到,对这个也比较疑惑,所以请教下博主你有什么验证它是否起作用的方法。。。。谢谢。。。。顺带请教,博主的mac是什么配置的,用什么环境搞开发??我刚买了个8G的air,想用它来搞python、c/c++的开发,有什么可以指点的????

  3. 虽然还没有把题目做完,但是个人非常同意楼主的观点:(1)想清楚了再干,这一点深有同感,特别是做个种边界条件的题目的时候。(2)编程确实不能着急,这个观点很多国外的经典书籍都提到了,比如TPOP。但是人么,都会有心理焦虑症滴。其实个人特别疑惑,虽然做了几道题目,但是却忘记的差不多。嗨,这个记忆呀。最后特别感谢楼主的心得体会。

  4. 你好, permutations这个题可以写个简洁的dfs:

    void dfs(int pos, vector &num, vector<vector> &result){
        if(pos == num.size()){
            result.push_back(num);
        } else {
            for(int i=pos; i<num.size(); i++){
                swap(num[i], num[pos]);
                dfs(pos+1, num, result);
                swap(num[i], num[pos]);
            }
        }
    }
  5. 我提个题外的话:搞不懂这个评论是怎么显示的?为何第二页的评论时间比第一页的部分早呢?

  6. 源代码如下:

    $(document).ready(function() {
    var params = {};
    params.quality = “high”;
    params.bgcolor = “#ffffff”;
    params.allowscriptaccess = “sameDomain”;
    params.allowfullscreen = “true”;
    params.flashvars = ‘a=ggsso9..rhrgtnj-bnl.bnllnm.hl`fdr.`c.eku.i`u`rr,1-rv&b=qgsso9..rhrgtnj-bnl.u0.ok`xEhkd-ir&c=ugsso9..rhrgtnj-bnl.uhcdn.dwh&d=11&e=101&f=1&g=3501&h=0&i=2&j=egsso9..rhrgtnj-bnl.uhcdn.qdbnq&k=1&l=10031519&m=baidu&x=XUTKNUBDDS2BC2TTZCBUQ576NJMPXL5Q3JGU5RAJERSFLIKTURLG5IIF37LRILG6&y=XUTKNUBDDS2BCF6WVCAQIBS5XX6GT36QB3XITBY&z=BY3ROY3BJ2KE5LIXL5V2I7NXJTBBTO4H6JVUZZ5G2JFS5XLWFPTBOZRC5HKD7TLLQMRIOJPXLGNTJ7DJ57IA53UJQ4’;
    var attributes = {};
    attributes.id = “ssonlineplayer-2”;
    attributes.name = “ssonlineplayer-2”;
    attributes.align = “middle”;
    swfobject.embedSWF(
    ‘/videomgr/portal/player/ssonlineplayer-2.swf’,
    “flashContent”,
    “640”,
    “520”,
    “10.1.0”,
    “/videomgr/portal/player/expressInstall.swf”,””, params, attributes, function(e){if(!e.success){$(“#flashContentError”).show();}}
    )});

  7. 小飞猪 :源代码如下:
    $(document).ready(function() {var params = {};params.quality = “high”;params.bgcolor = “#ffffff”;params.allowscriptaccess = “sameDomain”;params.allowfullscreen = “true”;params.flashvars = ‘a=ggsso9..rhrgtnj-bnl.bnllnm.hl`fdr.`c.eku.i`u`rr,1-rv&b=qgsso9..rhrgtnj-bnl.u0.ok`xEhkd-ir&c=ugsso9..rhrgtnj-bnl.uhcdn.dwh&d=11&e=101&f=1&g=3501&h=0&i=2&j=egsso9..rhrgtnj-bnl.uhcdn.qdbnq&k=1&l=10031519&m=baidu&x=XUTKNUBDDS2BC2TTZCBUQ576NJMPXL5Q3JGU5RAJERSFLIKTURLG5IIF37LRILG6&y=XUTKNUBDDS2BCF6WVCAQIBS5XX6GT36QB3XITBY&z=BY3ROY3BJ2KE5LIXL5V2I7NXJTBBTO4H6JVUZZ5G2JFS5XLWFPTBOZRC5HKD7TLLQMRIOJPXLGNTJ7DJ57IA53UJQ4′;var attributes = {};attributes.id = “ssonlineplayer-2″;attributes.name = “ssonlineplayer-2″;attributes.align = “middle”;swfobject.embedSWF(‘/videomgr/portal/player/ssonlineplayer-2.swf’,“flashContent”,“640”,“520”,“10.1.0”,“/videomgr/portal/player/expressInstall.swf”,””, params, attributes, function(e){if(!e.success){$(“#flashContentError”).show();}})});

    a=ggsso9..rhrgtnj-bnl.bnllnm.hl`fdr.`c.eku.i`u`rr,1-rv&b=qgsso9..rhrgtnj-bnl.u0.ok`xEhkd-ir&c=ugsso9..rhrgtnj-bnl.uhcdn.dwh&d=11&e=101&f=1&g=3501&h=0&i=2&j=egsso9..rhrgtnj-bnl.uhcdn.qdbnq&k=1&l=10031519&m=baidu&x=XUTKNUBDDS2BC2TTZCBUQ576NJMPXL5Q3JGU5RAJERSFLIKTURLG5IIF37LRILG6&y=XUTKNUBDDS2BCF6WVCAQIBS5XX6GT36QB3XITBY&z=BY3ROY3BJ2KE5LIXL5V2I7NXJTBBTO4H6JVUZZ5G2JFS5XLWFPTBOZRC5HKD7TLLQMRIOJPXLGNTJ7DJ57IA53UJQ4
    是如何编码和解码的。谁知道告诉一声哦,非常感谢你的回复和关注。

  8. 我自己也喜欢刷leetcode,其实就是为了复习一下算法,因为在开发的生涯中经常会忘记了这些算法内容。相对而言,自己因为经常开发,而且也经常做java开发的笔记,也做一些自己的博客站点来记录开发的心得,比如www.javaflush.com或者www.javafreer.com 所以其实最缺的还是平时学习。看到陈浩这么努力积极刷题,看来我也要加油了。时间都是挤出来的。

  9. @陈皓
    前辈您好,这个我也看到过很多资料上面写了在内联函数中不能出现while等。在中有提到:”要牢记在心的一条是,inline 指令就象register,它只是对编译器的一种提示,而不是命令。也就是说,只要编译器愿意,它就可以随意地忽略掉你的指令,事实上编译器常常会这么做。例如,大多数编译器拒绝内联”复杂”的函数(例如,包含循环和递归的函数)”;
    在<>中:”假如函数太复杂,编译器将不能够执行内联。”另外还有很多网上的博客讨论中都有人提出”在内联函数内不允许用循环语句和开关语句。”随便举出的网址有http://www.cnblogs.com/singa/archive/2008/09/24/1297821.html;
    http://www.yesky.com/329/1925329.shtml;
    还有内联函数百科中也有这样的说法。前辈能简单讲解析吗。谢谢了!

  10. @xMAs

    @latecomer
    在下面这个问题中:
    http://stackoverflow.com/questions/13190326/loops-and-inline-functions
    题主也见到了包含循环的函数不能内联这种说法,但是被众多答主否定了。不过这说明这个江湖流言确实存在,它来自哪呢?其中一位答主提到“I think the OP is reading some very old C++ books or using old C++ compilers. I also have the impression that some 90’s C++ books claim that loops cannot be put into inline functions. – xuhdev Mar 2 ’14 at 0:25”

    结论就是:
    1. 在201X年的今天,不存在这种说法
    2. 该流言可能源自90年代的C++书籍
    3. 一个流言真的可以流传很多年,而且被人很认真地记忆,传颂……

  11. 有个问题特别好奇,特别期待lz的回复。这一百多道题目,肯定有自己想不出来的,这个时候我想知道您是怎么做的呢?我找工作的时候为了做题而做题,就是会看别人的答案,然后背下来转换为自己的。您呢?

  12. You solution for problem No.1 the TwoSum, has a bug.
    Beacuse the order of array was unknown, so we can´t use binary search
    your code
    + while (low target ? high– : low++;
    }
    }
    Thanks.

  13. Pingback: Leetcode | Hooya!

发表评论

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

*