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

关于刷题的一些碎碎念——来自一个 LeetCode 刷了 600 题的普通码农

  •  5
     
  •   enchilada2020 · 2023-01-27 00:38:36 +08:00 · 7299 次点击
    这是一个创建于 426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    混 V 站久了,总会看到几个关于 LeetCode 刷题的帖子,刚刚又刷到一贴,《刷算法题有感》,在底下想评论,奈何写了太多,最后决定单独开贴,一吐为快。

    码农来说,LeetCode 这种 OJ 适当刷刷能应付面试就得了,别太当真,除非你就是喜欢这玩意儿,本质上跟有人喜欢解数学题、有人喜欢写毛笔字、有人喜欢画漫画……等等等等没什么不同的话,那这个另算。

    可是,我相信发自内心喜欢这个的人终究是少数。大多数自诩对算法有热情的,无非是别有目的,也可以说是动机不纯,只是刚到了刷题的甜蜜点,自我催眠一下罢了。不然遇到难题想破脑袋都想不出来,那是真的打击积极性,不自我暗示一下根本坚持不下去。

    刷题只是为了过笔试找工作,这本身并没什么不对,进大厂多赚点钱嘛不寒碜,但这并不能称之为热爱。我始终认为,真正热爱算法的人,也一定会喜欢数学。因为算法的本质就是数学,解题时的思考过程也相差无几。不信你大可以去看看那些算法书,真较起真来是要用数学来证明算法的正确性和效率的。

    至于去讨论区看题解,发现各路高手贴出无比巧妙刁钻优雅简洁的解法,同时还附赠了简单的数学证明过程,当然会有 mind blown 时刻,然后相比之下自己就是个渣渣,就忍不住开始自我怀疑。

    然而,你跟那些高手比,就相当于你一个普通念书备战高考的,跟校田径队的体育特长生去比短跑长跑。你根本没花心思练过,某天心血来潮,看人家跑挺好,自己也想试试,结果跟着跑了两步,发现完全跟不上,然后说我靠这帮孙子跑太快了,我是不是体质不行没有天赋不适合跑步啊——大可不必如此。

    不说那些从初高中开始就玩竞赛的,毕竟人家可能根本瞧不上 LeetCode 这个平台的出题水平,哪怕是读了研才开始自学转码,只要下足功夫,也能做到 LeetCode 竞赛分数 2400 分左右——这是什么概念? Top 0.6%。怎么做到的?先刷够 2500 道题再说。扪心自问,你做得到吗?先不论是否可行,只看主观能动性,你真的愿意付出大量的时间和精力在这上面吗?

    话说回来,刷题有没有用,要看你的目的是什么。如果像上面提到的那样,为了刷题过笔试找工作进大厂赚高薪,那肯定是有用,不然 LeetCode 不会火遍全球。但 LeetCode 刷得溜,并不代表你工程能力强,能写出易于维护、方便扩展的代码,或是能做出超炫酷的软件,也不代表你的算法造诣深,能像 Dijkstra 那样发明新的算法,同样不代表你能设计出一个数据库、编译器、网络协议或是操作系统,这些领域对算法确实有相当的要求,但刷题本身跟这些完全是两码事。

    抛开功利性的目的不谈,刷题本身对码农来说也是种思维和编程上的双重训练。能解难题,说明对某些明确了特定条件的问题,有较强的抽象能力。很多时候眼睁睁看着归类标签,明知道要用某一算法来解,读完了题都不知道从哪开始下手。另外题解代码能同时做到“高效、优雅、简洁、易读”,说明你比较熟悉某一门编程语言,能用一些语法糖和语言特定的“奇技淫巧”,以及在工程上至少某一局部的代码,比如明确了输入输出的某个 util 函数,能写得比较优质。

    君不见有太多基本编程素养不过关的码农,为了解决一个很简单的功能,循环嵌套了一层又一层,却根本不知道一个递归就能简洁明了地搞定。对于这样的选手,简单刷几十道题就会有明显进步,那刷题肯定是有用的。

    再简单推荐两个我的偶像,LeetCode 上比较老的题的讨论区很容易找到 Stefan,这位好几个语言都玩得贼溜,但很久不更新了,大概对他来说解题只是娱乐的一种吧,感兴趣的可以去他的上古个人博客看了解更多。新题则是国人之光 Lee215我愿称之为 LeetCode 界的 Faker (不是),基本每个题解都会有 C++/Java/Python 三种写法。国服大佬也很多,但我只刷过美服,就不太了解了。

    虽然可能没人感兴趣,但都写了这么多,就干脆再简单聊下自己。我刷题坚持刷了一年多,每天 996 下班回家之后还开机刷道题,365 天风雨无阻毫无例外,当时自我感动得不行,最后也只是拿了个 LeetCode 的 Annual Medal 2021 徽章而已,依然菜得抠脚。到目前不刷题也已经快一年了,因为意识到在软件工程领域,无论是 Web 前后端还是别的什么,都还有更多有趣的东西可以去探索把玩。同时也是因为根本没可能去 FAANG 或是 GAMAM ,whatever ,就看开了。

    最后感谢各位花时间来看我这一时兴起的水贴,欢迎各路大佬拍砖指教,也欢迎像我一样曾经虽菜但肝的小伙伴来讨论。

    50 条回复    2023-02-05 17:17:24 +08:00
    Jface
        1
    Jface  
       2023-01-27 00:51:08 +08:00 via iPhone
    感谢分享,今年假期才开始刷题,主要为了找工作应付面试…
    EIJAM
        2
    EIJAM  
       2023-01-27 00:55:09 +08:00   ❤️ 1
    学习了
    Knuth
        3
    Knuth  
       2023-01-27 01:06:45 +08:00 via iPhone
    我都是刷刷 hot100
    PythonYXY
        4
    PythonYXY  
       2023-01-27 01:07:57 +08:00   ❤️ 3
    赞同。绝大多数人刷题的目的就是为了面试,选择性价比最高的方式刷题才是正解,而不是花大量时间在一些「奇技淫巧」上。毕竟算法只是面试的其中一部分,而且随着工作年限的增长,算法八股文这些内容在面试中的占比也会越来越低的。。。
    Rrobinvip
        5
    Rrobinvip  
       2023-01-27 01:10:19 +08:00
    赞同,和 op 的想法基本一致。
    enchilada2020
        6
    enchilada2020  
    OP
       2023-01-27 01:11:28 +08:00 via Android
    @Jface 哈哈 说实话到目前为止我的刷题经历没有任何用武之地😅
    刚开始还是按 tag 来 从 easy 到 medium 挨个做上十几道 找找感觉再说 这样下来也能有百八十题了 然后再进阶
    大佬告诉我水水周赛也挺好的 但我个人水平不够 就没碰 也可以参考一下
    enchilada2020
        7
    enchilada2020  
    OP
       2023-01-27 01:12:35 +08:00 via Android
    @Knuth 我也想着如果将来哪天真的要为面试再捡起 LC 了 那就用 hot 100 找找手感得了 要是再让我肝 500 题 真的不行了。。
    enchilada2020
        8
    enchilada2020  
    OP
       2023-01-27 01:15:44 +08:00 via Android
    @Rrobinvip 求同存异一下 有什么想补充或者想指正的点吗?
    hxtheone
        9
    hxtheone  
       2023-01-27 01:38:32 +08:00 via iPhone
    于我而言刷题最大的收获就是算法题没遇到太大压力就面进了外企,另外就是学新语言的时候都拿 leetcode 每日一题来练手,顺便维护了一套题解 https://leetcode150.xhu.me/
    Mirage09
        10
    Mirage09  
       2023-01-27 01:53:20 +08:00   ❤️ 1
    刷 leetcode 题是用来筛 new grad 或者 junior level 的人的
    另外就我个人而言,任何出 hard 题的公司都不值得我去面
    (是的,说的就是你 Google )
    enchilada2020
        11
    enchilada2020  
    OP
       2023-01-27 08:02:36 +08:00 via Android
    @hxtheone 题解不错 收藏了
    用 LC 来熟悉练习新语言确实是个好办法
    enchilada2020
        12
    enchilada2020  
    OP
       2023-01-27 08:15:00 +08:00 via Android
    @Mirage09 哈哈 不止🐶家 蕉厂据说也会出 hard
    raysaii
        13
    raysaii  
       2023-01-27 09:16:47 +08:00
    谢谢你,解答了我疑惑。我考虑把解题数提高到一下,就不再纠结了
    enchilada2020
        14
    enchilada2020  
    OP
       2023-01-27 09:40:53 +08:00 via Android
    @raysaii 现在正纠结什么呢🤣
    刷多了就会发现 解题有时候有固定模板可以套 不过知其然不知其所以然的话 比较没有灵魂。。
    zhangxh1023
        15
    zhangxh1023  
       2023-01-27 09:56:41 +08:00 via iPhone
    这两年经常上班摸鱼刷个一两题,去年认真打了一下周赛,终于能够偶尔四题了。
    要说有用吗,确实也没啥用,要说没用吧,确实挺有成就感。然后就懒得打了,纯无聊刷题😂
    raysaii
        16
    raysaii  
       2023-01-27 09:59:49 +08:00
    @enchilada2020 为了面试呀,刷到一个还凑合的数目,哈哈哈
    cnsdytedison
        17
    cnsdytedison  
       2023-01-27 10:00:48 +08:00 via Android
    话说楼主除了刷题工作下班后还有别的事情分散精力嘛。一般 99 之后给多久时间刷啊。
    顺,膜拜大佬
    enchilada2020
        18
    enchilada2020  
    OP
       2023-01-27 10:13:48 +08:00 via Android
    @zhangxh1023 你这个状态就很羡慕了 对刷题来说确实是摸鱼无聊时刷最理想
    enchilada2020
        19
    enchilada2020  
    OP
       2023-01-27 10:17:51 +08:00 via Android   ❤️ 1
    @cnsdytedison 完全没有 那阵子是个无情的代码生成器 上班堆业务下班刷题 然后刷刷手机睡觉 loop
    我属于人菜瘾大不太开窍的那种 后期一般一道题顺的话 20 分到 40 分差不多 不顺的话可能要花 2 个多小时 前期刚开始一道题卡两三天都有可能
    一般建议 20 分钟没思路就直接抄题解了 把题解看懂之后再做一遍之类的 如果有思路但被 edge case 卡了可以多花点时间 debug
    Origami404
        20
    Origami404  
       2023-01-27 10:26:42 +08:00 via Android
    刷题的回馈性很强,相当于一个个消耗时间可控非常可控的“小项目”,在没有特别想做的 side project 的时候其实是维持代码手感好选择

    (可惜我现在想做的 side project >> 我能做的,所以我还没刷过多少 leetcode:)
    enchilada2020
        21
    enchilada2020  
    OP
       2023-01-27 10:30:47 +08:00 via Android
    @Origami404 确实很强 一气呵成 AC 掉之后会开心好一阵子 如果跟大佬思路一致那更爽了 然而听取 WA 声一片时也很酸爽 hhh
    楼上也有人说靠刷题熟悉语言 真无聊时刷两道还是挺好玩的
    acctv2
        22
    acctv2  
       2023-01-27 11:22:03 +08:00
    我感觉大多数情况下刷题就是一个脑力训练,并非有多高的工程实用价值,虽然找工作也很有用。

    真学算法,还得从数学科班搞起...
    vlgs
        23
    vlgs  
       2023-01-27 11:30:36 +08:00
    算法本质是数学。但是学数学不能让你学会做算法题。数学学的也不是做算法题。
    RedisMasterNode
        24
    RedisMasterNode  
       2023-01-27 11:56:08 +08:00
    小心一会又有人来喷你说刷题是服从性测试了
    enchilada2020
        25
    enchilada2020  
    OP
       2023-01-27 12:07:54 +08:00 via Android
    @acctv2 对于应用开发者这样偏业务实现的 算法确实没什么用武之地 但基础库实现或是正文里提到的那些相对硬核的领域 算法肯定是不可或缺的基本功
    但其实就算是业务码农 最基本的数据结构和算法思想也要掌握 不说 DP 红黑树之类的高级概念 至少树是什么要了解 树的遍历要会写 为什么?因为最常见的 JSON 本身就是个树 不怕你笑话 我们组现在有个同事连这个都意识不到 写个业务逻辑 处理下数据 也能糊成一坨…
    enchilada2020
        26
    enchilada2020  
    OP
       2023-01-27 12:12:09 +08:00 via Android
    @vlgs 是的 但目光再放高些 那些经典算法大多都是数学造诣很深 或干脆就是数学出身的人搞出来的
    当然单论刷题来说 纯数学背景的也做不到顺手拈来 但我相信肯定比数学 /逻辑能力差的人上手要快很多很多
    enchilada2020
        27
    enchilada2020  
    OP
       2023-01-27 12:14:49 +08:00 via Android
    @RedisMasterNode 哈哈 这个见仁见智了 之前不是有个经典梗 home brew 作者因为写不出翻转二叉树被🐶家拒嘛 如果让这位爷来说 那肯定也要喷刷题是服从性测试了 毕竟被伤害过。。。
    Mirage09
        28
    Mirage09  
       2023-01-27 12:41:05 +08:00
    @enchilada2020
    蕉厂方差太大
    三年前面进去的时候的 coding 都是 medium 的题
    SiuRayyy
        29
    SiuRayyy  
       2023-01-27 14:31:34 +08:00
    说得挺好👏🏻
    DeltaC
        30
    DeltaC  
       2023-01-27 15:39:37 +08:00
    本科打了三年 xcpc,已经意识到自己不是这块料,现在刷题就为找饭碗,热爱算法想体验被虐的感觉可以去 codeforces 打 div1/2 。
    BingoXuan
        31
    BingoXuan  
       2023-01-27 16:04:05 +08:00
    「“君不见有太多基本编程素养不过关的码农,为了解决一个很简单的功能,循环嵌套了一层又一层,却根本不知道一个递归就能简洁明了地搞定。”」
    没错,递归可以解决不少洋葱代码。最近接收的项目代码看得头痛,各种奇葩实现。用递归实现代码量减少很多而且更加清晰,业务 bug 也少。唯一缺点就是,递归结束条件比较难一次写好。
    rainsho
        32
    rainsho  
       2023-01-27 16:42:07 +08:00
    佛系爱好者,刷题两年半,解题 1200 ,每日一题,能解就解,解不出来也不死磕,除非当天闲的蛋疼。我倒觉得这个玩意儿挺有意思的,三言两语给你个任务去解决,不像日常工作,有繁重的上下文,脑袋疼。。。
    enchilada2020
        33
    enchilada2020  
    OP
       2023-01-27 17:20:57 +08:00 via Android
    @SiuRayyy 哈哈 感谢肯定
    enchilada2020
        34
    enchilada2020  
    OP
       2023-01-27 17:23:55 +08:00 via Android
    @DeltaC 正文里也提到了 所谓热爱只是到了甜蜜点而已 上来就 hard extreme 都是直接自闭的 专业选手也不例外
    enchilada2020
        35
    enchilada2020  
    OP
       2023-01-27 17:27:00 +08:00 via Android
    @BingoXuan 这正是基本功的体现 有过对比才能感受到什么是优雅
    macha
        36
    macha  
       2023-01-27 17:27:50 +08:00   ❤️ 1
    在学校时候先刷剑指 offer ,再刷 LeetCode ,当年手写代码贼溜,走路和坐着发呆的时候都在回味,可惜现在已经忘完了。

    现在回想起来刷 LeetCode 好处是极大的提升了我的思维和编码能力,还有对数据结构,常见编程思想的理解。

    所以说,刷一刷还是挺不错的。

    不过现在做码农时间久了又会发现,架构,业务,调试能力比算法更加重要,当然也有可能是我做的产品对算法要求不高。
    enchilada2020
        37
    enchilada2020  
    OP
       2023-01-27 17:29:52 +08:00 via Android
    @rainsho 谦虚了 每日一题坚持两年半可不佛了 挺肝的哈哈哈
    就像楼上有人说的那样 这个即时反馈感很强 相比又繁琐又啰嗦又无趣的业务肯定更好玩儿些
    enchilada2020
        38
    enchilada2020  
    OP
       2023-01-27 17:32:36 +08:00 via Android
    @macha 确实 很有共鸣 我觉得这应该是码农的常见心路历程
    movq
        39
    movq  
       2023-01-27 19:20:55 +08:00
    楼主的 600 题指的是找工作之前就刷了 600 道?还是说截止到目前一共?楼主应该已经工作了吧
    Mrun
        40
    Mrun  
       2023-01-27 19:57:14 +08:00
    算法这东西,除了码农的职业初期用来筛选不合标准的。

    后期大部分面试情况都是聊业务以及架构实现了。
    enchilada2020
        41
    enchilada2020  
    OP
       2023-01-27 20:44:30 +08:00 via Android
    @movq 边工作边刷的 实际上找工作面试那阵在我看来根本没问算法。。coding 很简单 读完题就直接一个递归搞定 基本没什么思考过程 毕竟不是大厂
    msg7086
        42
    msg7086  
       2023-01-28 08:16:25 +08:00
    我被面的时候基本都是 easy 到 medium ,没见过 hard 题。
    Moha
        43
    Moha  
       2023-01-28 09:28:48 +08:00
    作为一名普通人,我目前正在准备找工作,刷了 400 道左右,我发现 hard 题,脑筋急转弯,数学推导类的题目真的很难写出来,平常都调试很久,更别说面试的时候了.......除非是真的大佬
    ytmsdy
        44
    ytmsdy  
       2023-01-28 10:33:59 +08:00
    作为大学期间 OJ 做了上千道题目的人来说一说
    1:刷题只是一个比较容易证明自己编程水平的方式
    2:这玩意儿刷个 100 多题,把常规的几种算法熟悉熟悉,对算法的适用范围又一个清晰的了解就可以了
    3:刷题最难的不是算法,而且根据具体的题目,找到最适合的算法
    4:在需要换工作的时候,阶段性的刷一刷就好了。
    ytmsdy
        45
    ytmsdy  
       2023-01-28 10:35:21 +08:00
    5:别去做那些 hard 题目,那些题目是给那些脑回路清奇的人做的。咱们这些普通人就别去找虐了。
    6:人和人的智商差距是巨大的,要认清现实,别没事给自己添堵。
    AustinDeng
        46
    AustinDeng  
       2023-01-28 15:05:03 +08:00   ❤️ 1
    就亲身经历而言,刷题确实是有用的。

    去年面鹅厂实习,二面是 mentor 面,发挥不好,原本是要被刷掉的,但是一面 leader 面的还不错,然后 leader 看了我 leetcode 刷了差不多九百题(差不多刷了一年),觉得我是一个有恒心会坚持的人,就给我过了,后面总监面和 HR 面基本就是走个过场了。

    确实有点侥幸或者运气,希望新的一年大家都可以有所好运。
    furlxy
        47
    furlxy  
       2023-01-28 17:57:51 +08:00
    所以那么多喜欢招 leetcoder 的意义是什么呢?企业一边不想通过小作业方式筛选工程能力、架构能力,一边又在用与工作无关的 leetcode 筛人,到底是谁急功近利。
    enchilada2020
        48
    enchilada2020  
    OP
       2023-01-28 18:30:39 +08:00 via Android
    楼上有几位提到了 hard 个人资历尚浅 没见识过太多面试 道听途说来的印象是 一般好一点的企业面试会出几道 medium 主要看思路 在解题过程中跟面试官的交流很重要 至于出 hard 只有三种可能 一种是变相劝退 人家出于各种理由不想招你了 又不方便明说 一种是额外加的 bonus 面 过了会给 special package 还有一种是 FAANG 。。。务实且有诚意招人的公司应该不会那么想不开 哈哈哈
    enchilada2020
        49
    enchilada2020  
    OP
       2023-01-28 18:34:16 +08:00 via Android
    @furlxy 这个属于更宽泛一些的问题了 非要说的话 因为作为行业标杆的那几家巨头就是用这种方式筛人的😅
    shanejix
        50
    shanejix  
       2023-02-05 17:17:24 +08:00 via Android
    赞同 双手赞同👍👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3288 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:12 · PVG 22:12 · LAX 07:12 · JFK 10:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.