V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
begeekmyfriend
V2EX  ›  LeetCode

C 语言刷 150 道 LeetCode 经验谈

  •  1
     
  •   begeekmyfriend ·
    begeekmyfriend · 2017-11-11 09:36:48 +08:00 · 22369 次点击
    这是一个创建于 2567 天前的主题,其中的信息可能已经有所发展或是发生改变。
    抽空将自己 LeetCode 前 150 道源码整理出版了 https://github.com/begeekmyfriend/leetcode

    再复杂的题我都坚持用 pure C 手写的,最多一道大概 300 行吧,不容易。即使如此仍然有 5 道打出爆机(效率排名 100%,题目越复杂几率越高),要知道那可都是累计了好几年的老题了,可见全球范围内我的代码还是有不少闪光点的:-P

    C 是没有 STL 的,只能自己造轮子。链表怎么写,hashmap 怎么写,我借鉴的是内核的 list.h,写法已经形成自己一套模式,看上去还算简洁,不像参考答案写得那样 hack,混乱不堪。关键是能解决问题,特别一些复杂的逻辑,运气好还能爆机。可见对于 C 来说,也不要从 0 开始写代码,要学会站在巨人的肩膀上。

    用 C 刷 LeetCode 有个坑就是动态数组,个人经验是,尽量不要用 realloc 调用,会出现 runtime error,这应该算 LeetCode 平台的 bug。之前我被困扰了好久,后来终于想出了用手写 realloc 的办法,方法是,用两倍内存扩容,手动拷贝元素,释放原指针,赋值新指针。步骤很繁琐,但再也没出问题。

    刷题就像打《街霸》,前 50 道被电脑虐得磕磕绊绊,最痛苦的时段;再 50 道你就有点感觉了,开始慢慢形成自己套招; 100 道之后一般能够应付各种难度,这时候主要靠直觉和意识了。

    要不要继续刷看心情吧,刷题经验不见得看题量,也许回头我还会改进一下写过的代码。顺便赞一下 leetcode 选题眼光不错,一些看似考智力的问题,其实都有经典的数学背景。不过后期一些个人贡献的题目质量比较水,没多大价值。出好题也是要看学识背景的。

    欢迎与大家切磋,共同改进。
    47 条回复    2018-10-13 22:11:54 +08:00
    UnknownR
        1
    UnknownR  
       2017-11-11 09:39:36 +08:00
    厉害厉害,已 start & fork,正好周末学习一下
    thinkIn
        2
    thinkIn  
       2017-11-11 09:46:18 +08:00
    向楼主学习
    Ruin
        3
    Ruin  
       2017-11-11 09:56:06 +08:00
    如果是为了练习算法思维的话,用脚本语言写应该会更有效率。一年前为了准备面试刷题,那时整个 LeetCode 只有两百多道题,用 Python 过了两遍。
    n2l
        4
    n2l  
       2017-11-11 09:56:36 +08:00 via iPhone
    向楼主学习。
    begeekmyfriend
        5
    begeekmyfriend  
    OP
       2017-11-11 09:57:24 +08:00
    @Ruin 你说的没错,实际工程中都是用脚本 XD
    ytmsdy
        6
    ytmsdy  
       2017-11-11 10:10:24 +08:00 via iPhone
    大学刷了 4 年 acm 的表示,已经完全没有任何刷题的欲望,和用 c 语言写程序的欲望了!
    jimzhong
        7
    jimzhong  
       2017-11-11 10:12:59 +08:00
    @ytmsdy +1
    logbang
        8
    logbang  
       2017-11-11 10:20:16 +08:00 via Android
    佩服
    surewen
        9
    surewen  
       2017-11-11 10:36:18 +08:00
    点赞。
    simomo2010
        10
    simomo2010  
       2017-11-11 10:46:12 +08:00
    赞啊~

    刷 150 题大概用了多久?每天投入多少时间?
    begeekmyfriend
        11
    begeekmyfriend  
    OP
       2017-11-11 10:47:04 +08:00
    @simomo2010 我在职啊怎么可能有太多时间,平均一天一道吧
    NumberFairy
        12
    NumberFairy  
       2017-11-11 10:50:37 +08:00
    已经 fork,向你学习
    eminemcola
        13
    eminemcola  
       2017-11-11 10:52:02 +08:00 via iPhone
    在职情况下一天一道能坚持下来也是非常厉害的事情了 楼主很棒 向你学习
    fanazhe
        14
    fanazhe  
       2017-11-11 10:53:05 +08:00
    看题目难度的话楼主应该是初学算法吧?值得鼓励!
    建议再深入研究一些——当然如果只是想刷一刷面试题的话就无所谓了
    @ytmsdy 从开始做 ICPC 比赛到工作这么多年,我好像从来都是用 C++几乎没用过 C 233333

    PS:看楼主的“出版”两个字感觉浑身不舒服……
    begeekmyfriend
        15
    begeekmyfriend  
    OP
       2017-11-11 10:56:20 +08:00   ❤️ 1
    @ytmsdy 现在的 C 已经有成熟的规避指针的写法,比如链表,也就几十行代码。同时又规避了 C++库带来平台问题,研究一下还是很值得的。
    begeekmyfriend
        16
    begeekmyfriend  
    OP
       2017-11-11 11:01:12 +08:00
    @fanazhe 深入的话我情愿去研究数据领域的算法,比如机器学习,神经网络,毕竟在行业领域有用。竞赛之类的算法还是罢了,毕竟年纪大了。。。
    hxtheone
        17
    hxtheone  
       2017-11-11 11:01:33 +08:00
    Pure C 刷题就真是厉害了, 我就是图方便用脚本语言刷题的那种, 不过为了啃 hard 题已经重新拿起算法书了

    顺便贴一下我的 repo 厚颜无耻求一波 star: https://github.com/MrHuxu/leetcode
    glues
        18
    glues  
       2017-11-11 11:06:37 +08:00
    厉害!
    有没人刷过操作系统的题,看起来有点难?
    begeekmyfriend
        19
    begeekmyfriend  
    OP
       2017-11-11 11:10:46 +08:00
    @hxtheone pure C 容易打出爆机,用 C++和 Java 没这体验:-P
    hxtheone
        20
    hxtheone  
       2017-11-11 11:37:05 +08:00
    @begeekmyfriend #19 嗯, 脚本语言肯定没法全语种爆机, 只能争取在当前语言里 beat 100%了
    begeekmyfriend
        21
    begeekmyfriend  
    OP
       2017-11-11 11:47:09 +08:00
    @hxtheone 我没说我是全语种,C++优化够深的话可能比 C 快,当前语言能爆出来就很不错了
    halfer53
        22
    halfer53  
       2017-11-11 11:57:05 +08:00 via Android
    链表你是怎么写?直接把 list.h 里面的 4000 行代码复制进去吗
    begeekmyfriend
        23
    begeekmyfriend  
    OP
       2017-11-11 12:03:07 +08:00
    @halfer53 你觉得那样会 Accept 吗?看我 146 LRU 的做法
    lsmgeb89
        24
    lsmgeb89  
       2017-11-11 13:18:57 +08:00
    Mirana
        25
    Mirana  
       2017-11-11 13:32:01 +08:00
    100%可能跟它效率判定有关吧,好像每次跑都不一样。。。我也出过几次,在跑可能就不是了
    GromHellscream
        26
    GromHellscream  
       2017-11-11 13:46:23 +08:00
    赞一个,向楼主学习。
    neosfung
        27
    neosfung  
       2017-11-11 14:10:34 +08:00
    还是喜欢 c++多一点
    自己的结题集合,五六百道题了吧
    https://github.com/neofung/acm_backup
    含 HDU POJ URAL XMU ZOJ
    holyghost
        28
    holyghost  
       2017-11-11 15:03:08 +08:00
    C 确实很诡异,我一般用 Java,加起来刷了 455 道,算法题有 432 道。

    顺便献个丑: https://github.com/liupangzi/codekata/tree/master/leetcode
    sfqtsh
        29
    sfqtsh  
       2017-11-11 15:18:52 +08:00 via Android
    每个题下面有个 README.md 就好了,里面包含题目内容!
    hardman
        30
    hardman  
       2017-11-11 15:43:22 +08:00
    int multiply(int a, char *b) {
    return a b;
    }

    我就想问这道算法题如何解,codewars 的 c 注册入门题目
    begeekmyfriend
        31
    begeekmyfriend  
    OP
       2017-11-11 15:51:30 +08:00 via Android
    @hardman 把 a 写成 char,然后相乘,LC 上有,忘了第几道
    ballshapesdsd
        32
    ballshapesdsd  
       2017-11-11 16:30:32 +08:00
    python 快,我用一个月把免费的题刷完了
    cabing
        33
    cabing  
       2017-11-11 21:32:27 +08:00
    赞一个~ 刷题很费时间吧 :)
    ytmsdy
        34
    ytmsdy  
       2017-11-11 23:03:58 +08:00 via iPhone
    @begeekmyfriend 写过 java,写过 c#,写过 python,没事不会回去瞎折腾了!
    Yzstr
        35
    Yzstr  
       2017-11-11 23:41:33 +08:00 via iPhone
    向楼主学习
    songteng0604
        36
    songteng0604  
       2017-11-12 01:23:44 +08:00 via iPhone
    向楼上学校
    83f420984
        37
    83f420984  
       2017-11-12 07:37:45 +08:00
    JavaScript 刷了一个半月的结果: https://github.com/zhen-ke/leetcode
    huayun
        38
    huayun  
       2017-11-12 21:19:04 +08:00
    向楼主学习
    Ashara1123
        39
    Ashara1123  
       2017-11-13 10:20:52 +08:00
    向楼主学习
    rover5056
        40
    rover5056  
       2017-11-13 11:15:58 +08:00
    @hxtheone
    同 JS 党。。。
    hxtheone
        41
    hxtheone  
       2017-11-13 11:28:46 +08:00
    @rover5056 #40 握爪握爪
    holy_sin
        42
    holy_sin  
       2017-11-13 14:04:21 +08:00
    厉害 用 swift 刷了 几十道,发现对编程能力提升很大
    KnightJoker
        43
    KnightJoker  
       2017-11-13 18:24:21 +08:00
    Pure C ! 这个就是真的厉害了,想问一下楼主每天 AC 一道平均花费的时间是多少啊?
    自己当初在当前语言 beat 100%的时候就开心得不得了,也想问问楼主爆机的感觉是啥样的=。=
    最后同样厚颜无耻的贴一下自己的 repo: https://github.com/KnightJoker/LeetCode-Solutions
    希望能有路过大神指点指点小弟
    begeekmyfriend
        44
    begeekmyfriend  
    OP
       2017-11-13 20:02:48 +08:00 via Android
    @KnightJoker 大概像“全球吹的那些神牛其实也不过如此”之感(笑)
    daliang
        45
    daliang  
       2018-01-11 17:22:02 +08:00
    @holy_sin 真的吗?如果是真的,我也准备刷题了,我时间很多.
    daliang
        46
    daliang  
       2018-01-11 17:23:01 +08:00
    向楼主学习
    huminted
        47
    huminted  
       2018-10-13 22:11:54 +08:00
    刚开始做,感觉被虐爆了,自己太菜了,头疼。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:41 · PVG 20:41 · LAX 04:41 · JFK 07:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.