链接:https://www.zhihu.com/question/399753856
编辑:深度学习与计算机视觉
声明:仅做学术分享,侵删
开学就大二,疫情在家刷了leetcode的每日一题,基本中等都是看题解,然后自己写。每天都感觉自己在刷题,但没有效果。小伙伴问有必要每天坚持刷题吗。
作者:程墨Morgan
https://www.zhihu.com/question/399753856/answer/1653942986
我读书的时候还没有leetcode这样的网站,但是教材上也有不少编程题,但是我校数据结构和算法教材脱胎于《计算机程序设计艺术》,多是伪代码描述解决方法,不具体到某种语言,除了上机考试也不要求写出真代码,后果就是,我们那一代同学,普遍解题思路很敏捷清晰,但是对于某门语言的掌握就不够深,基本靠课外自学成才。
当然,这也不是大问题,当进入实际工作中,无论是在教研室还是公司,管他用的是什么语言,大学课程训练的思维方法这时候就起到很大作用,编程语言特性很容易学会,但思维方法却是需要几年的训练积累,只要思维方式和基础知识到位了,很容易就能适应工作需要。
像题主说的,刷题如果是『看题解,然后自己写』,然后『没有效果』,我猜根本原因不是他不努力,而是思维方式和基础知识还没到位。
打个比方,你学打网球,要不要每天打一场比赛?表面上看,网球就是比赛,好比计算机专业就是要产出代码,但是,为了打好网球,你不能完全靠比赛来提高水平,你先得要体力,然后对于动作技巧要掌握,知道自己的身体肌肉如何正确运动,不是说看了费德勒比赛录像就能学会正确姿势的,这需要在比赛之外专门训练,所以,在学习网球初期,训练正确的姿势更重要,和菜鸟打比赛赢了多少分一点意义都没有,你用错误的姿势去打反而养成不好的习惯。
所以,如果题主觉得『没有效果』,那么就应该多花时间在思维方式和基础知识的培养上,不要着急去做每日刷题。
我知道我知道,肯定会有人问:问题来了,怎么培养思维方式和基础知识呢?
答:在大学上课要认真听讲,你爹妈给你交的大学学费,不是只让你去刷题和拿文凭,你要对得起学费就要上课认证听讲,那些知识课堂上都讲。
我知道我知道,肯定还会有人说:我们大学里老师水平很差,他们都讲不明白。
答:尽量去听,老师水平很差不代表一无是处,如果你真觉得大学水平配不上你,退学,重新高考去考一个更牛的大学,如果你考不上更牛的大学,那么现在的大学就是配得上你的大学,接受这一点吧。
作者:yyyyyr
https://www.zhihu.com/question/399753856/answer/1608833085
反对无前提条件下,鼓吹刷题的回答。实际上,计算机专业大多数人,都认为坚持刷题会对保持专业思维乃至提升专业认知有巨大帮助,这是想当然式的误区。
先抛出观点,提升专业思维只有一条道路,那就是不断深入地学习计算机各个门类的建构思想。
提问者的直觉是对的,坚持刷题一段时间后,发现自己并没有得到明显提升,这时候就应该停止刷题。若学习效果不够巨大,则等于浪费时间。
我先讲一个类似案例。我上高中的时候我们班有一个男生热衷于每天写两道奥数题,他的想法是我奥数题都会做了,以一个如此高的思维强度去应付高考还不是简单。最后如愿以偿地,他高考失利了。
写奥数题学不到东西吗?不是,能学到很多东西,但都是一些trick,也就是犯了聪明,小聪明啊,这些都不是数学建构的思维,只见树木,不见森林。他不擅长数形结合,书上的结论自己也没有推过一遍,做题不系统规矩,高考自然要挂他。
刷题是同样的。回到第一句话中的前提条件,我认为没有编程经验的,近期需要找工作的,以及一年大大小小十几个比赛的,刷题很有必要;除此之外,刷题就是浪费时间,即使分门别类去刷,效果也不见长。
继续举栗子,有人可能觉得刷题对提升算法思维有帮助,我们就来看看《算法导论》中是怎么研究动态规划的。在介绍动态规划的前几章,这本书先介绍了分治法,并在动态规划的开头明确点出动态规划的定义:规划,是一种表格化解法而不是计算机代码。在正文部分,作者先用一个装配线问题开篇,用足足两页的篇幅分析了问题的本质,之后再尝试用暴力法求解,发现在数量很大时暴力法需要的时间复杂度下限太高了,那怎么办呢?哦,我们可以把这个问题先用递归表达出来,接着想办法把复杂度下限优化到最快,用for循环代替递归,那就初步得到了一个能用的算法。接着书里还举了一个矩阵链乘法的例子去帮你加强这种优化印象,注意,到这里,这种for循环方法还只是读者脑中一个印象。
通过两个例子的求解,可以开始剖解此类问题的本质了,书中点出动态规划两个基本概念,最优子结构和重叠子问题,并对此做了剖析,再然后告诉你要做动态规划,要构造最优解并且把他存起来,这就是用空间换时间。
好了,现在你已经掌握了动态规划的底层方法,就带着这种思想去解决最长公共子序列的问题吧。完。
来看一下刷题和这种系统学习有什么区别。
《算法导论》的研究符合一般研究规律,都是发现问题——分析问题——解决问题——发现问题变种的循环,这种直来直去的思维,相比于leetcode那一堆故事讲的乱七八糟,强行配条件,各种暗示你该用哪种算法,实际挖了个巨坑的叙事模式不知道高到哪里去了,你这种题刷多了,在理解层面脑子就会变得很混乱。
接着来看具体的,规划是一种表格化解法而不是计算机代码,这叫做概念定义。试问有几个人,一想到dp,脑子里出现的不是那两个for循环?刷题时不会给出这样清晰的定义。
再然后碰到了问题,我们首先尝试用暴力法求解,这叫做寻找baseline,baseline是拟解决一个问题所能找到的性能不太好的方法,但能用;反过来,只要我的方法比baseline有提升,我就成功了。leetcode上的解答基本都是最优解,你很少能看到别人从较差解法优化过来的细节。
由于暴力法跑得慢,我们必须用递归把问题表达出来。这叫做具体问题的抽象化,很多刷题人写题没有抽象化这个过程,accpted之后也不知道自己是怎么写出来的。
根据一个例子,我们分析dp问题的本质是两个概念了,这就是学术中的基本假设。知道了这两个基本假设,你才知道哪些问题能用dp做,哪些不行,到这里为止,你已经了解了动态规划的本质,以后碰到不管多难的题,你都可以用最优子结构重叠子问题去套一下,再也不怕题干挖坑了。但你自己显然总结不出如此精炼的前提条件。
结论收束,刷题后,除了两个for循环,你不能收获任何计算思维。
不只是算法,单纯编程层面,刷题也无法提供有效反馈。提问者作为计算机专业的学生,应当始终以计算科学(Computing Science)的思维为目标,如果你觉得刷题除了保持手感没有额外增益,我的建议是一道题也不要刷,多写一道题都是浪费生命。
回到立论,提升专业思维只有一条道路,那就是不断深入地学习计算机各个门类的建构思想。有刷题的时间,不如多学学大神们是怎么发现问题和解决问题的。答主在专业领域也算走过不少弯路,曾经也是个轻度刷题家,最后在国内一些算法竞赛获得一些实在称不上有用的荣誉,我对此问题下一些答主模棱两可的“刷题可能有用吧”观点持反对态度,对“刷题需要有方向和方法”观点持弱反对态度,因为我觉得,对一个大二的学生来说,你的时间很宝贵,编程思维和计算思维还没有成型,多刷一道题都是反动的,因为路线错了。
作者:王一工
https://www.zhihu.com/question/399753856/answer/1974790624
个人情况,2021本科毕业生,美团ssp。
以我前前后后面试数十次的经验,我认为不太需要(如果只求进一个大厂)
我在找到实习前,略微写了三五道leetcode后来因为懒惰放弃了。凭着学校里学的一点点算法,基本也能磕磕绊绊地把面试级别的算法题过去。找实习面了两个厂,字节挂在二面算法了,腾讯一波过了。
后来因为划水(反卷斗士就是我)没能在腾讯转正,就秋招呗。
然后还是懒,不想写题。就硬着头皮找,反正就看面经,看别人考什么算法题了,就记一下。华为和美团的面试很顺利过了,分别拿到sp和ssp。其它厂子基本不是因为算法题挂掉的。
正经建议
可以看出我不是一个追求上进的人,而是爱偷奸耍滑,投机取巧的普普通通的毕业生。我相信大部分有实习和工作焦虑的同学可能在看到高赞们的回答后都会或多或少地给自己打鸡血,其实坚持下来的并不见得有多少。
所以我的建议是给和我类似的普通人的,让你用最少的时间,最安逸的过程取得性价比最高的结果(最字夸张了,大概是这么个意思)
建议1 不要死磕leetcode,个人感觉大部分人瓶颈并不在于算法题,而且面试的算法题并不算太难。我没有任何竞赛经历,也没刷过题,凭课堂知识和临时抱佛脚也能过个七七八八。但是我也不推荐学我直接躺平。把高频考点做一做看一看,我感觉就差不多了,更多的时间应该花在基本功和项目上。
建议2 深挖一个或两个知识点。面试中,一般会就一个问题展开问答,直到面试官和面试者其中有一个人不会为止。如果能在某一个知识点上让面试官闭嘴,是一个相当加分的点。
建议3 了解各种框架模型的设计思想,在场景题时能够给你更好的解题思路。即便自己依然不理解为什么,但是信手拈来地"引经据典",也许会让面试官感觉你的实战经验丰富。
其它的以后想到再更
总的来说,我不推荐像高赞们说的那样看大部头的书(看不进去啊!)
最省力的办法,就是用较少的精力让面试官觉得你厉害。知识点大致掌握就行,挖几个深的,多面几家,总能瞎猫碰上死耗子。学有余力,再拓宽,再夯实
作者:电子科大罗辑哥
https://www.zhihu.com/question/399753856/answer/1790194123
不需要每日刷题。
我觉得LeetCode上的题,其实也和高考数学、物理题一样是有迹可循的。我们不应该追求立刻把题写出来这种手感,而是应该弄懂原理,达到写1道题之后能做出同类型10道题的感觉。
掌握了最基本的方法,在往后面试需要的时候,只要看一遍以前做过的笔记,就能够想起来如何去写。
学会在刷题时分类总结,比如说链表的部分,插入/删除节点/查找倒数第k个节点,这些都是常考的题,你在做题之前更应该知道他的思路是什么。然后还有一些trick,像有的题要在头节点之前增加一个哑节点。
网上也有现成的总结,然后你再把其他章节也这样过一遍,面试中手撕代码的环节基本就没问题了。
在平时生活中我认为要做的是多写代码,培养自己对技术的兴趣。体会在现实生活中用计算机解决问题的喜悦。刷题只要在找工作之前突击一下,就没太大问题了。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓