刷 LeetCode 吃力正常吗?
共 6981字,需浏览 14分钟
·
2020-07-28 15:22
链接:https://www.zhihu.com/question/31092580 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删
https://www.zhihu.com/question/31092580/answer/54194793
大多数的 hard 都是特定领域的问题,如TCP的滑动窗口,编辑距离等。这些如果之前没有做过, 是很难独立完成的。我遇到问题的时候一般到 水中的鱼 找答案。这个博主是 facebook 的工程的,但有些题目他也没法立即想到答案或者最优解。所以别太灰心,好好做,会有收获的。
上个图说明我刷得很艰难。。
https://www.zhihu.com/question/31092580/answer/1014282264
Easy 的题目是不用思考就可以说出来答案的,但实际写的话还是要认真检查各种 corner case 有没有处理好,否则一不小心就有 bug,无法一次提交通过。
Medium 的题目有几种不同的情况,有些是问题比较难解决,有些是代码写起来超级复杂。对于前者,会需要花一定的时间想想怎么解,有可能能把题目转化为其它已经已经做过的题目。对于后者,需要花时间思考怎样写的代码能够覆盖所有 corner cases 但又 maintainable,而且写完不仔细检查很容易在某些地方留下小 bug,就变成了要通过多次提交来排 bug。
Hard 的题目就随缘吧,反正大概有一半是做不出来的。
「必须要有真实前端经验」是什么意思呢?例如说在大多数 JavaScript 引擎里面,比较两个字符串是否相等是 O(1) 而不是 O(n) 的操作,这个你知道就是知道,不知道就是不知道。如果你做过 JavaScript 性能优化,或者至少是做过性能分析来找瓶颈,那你很有可能遇到过这类问题从而知道这一点。
不过有一个事情是这样子的:其实在面试时,你不一定要做到最优解,你可以有些小 bug 但最好你自己能检查出来然后改对。(面试更看重的是跟面试官一起解题的能力,而不是独自一个人写出完美解的能力。很多人理解不到这一点,因为这跟学校的考试规则完全不一样。细节参考我其它答案。)所以在训练时对你自己要求更高一些,到面试时就可以放松做。
总之这个事情你可以理解为跟训练跑马拉松差不多。今时今日已经有很科学的马拉松训练方法,能让绝大多数人在一个月到几个月的时间内从零开始训练到能够跑完马拉松(合理时间内跑完)。这个过程大多数人只有有意志力都能坚持下来,但不代表它不痛苦。
https://www.zhihu.com/question/31092580/answer/477447691
每道题要有time constraint。大部分oj的题目如果需要想+写超过半小时,那就等于完全不会。实际面试中(任何考试中),你碰到的题目是不可能让你做超过1天的。所以每道题必须掐时间做,做不出来直接看答案,之后码一遍AC的代码。第二天重新做!!!
大部分Hard难度的题、brain teaser,个人以为是面试的帮助都不大。因为刷题的目的不是碰到原题,而是解决思路相似的题目。LeetCode hard难度题目难度远大于个人面FG new grad时候的题目难度。实际上FG new grad的phone interview 以及onsite难度个人以为属于medium里面比较容易的。
难以复现(以类似思路出现)的题目看看就好了。2里面的题目个人就是属于这种情况,个人认为easy里面一些math的题目,都基本不具有参考价值。
除了题目里面的算法内容,刷题还是需要注意些基本编程规范的,毕竟大部分公司面试都不会只让你写pseudo code。注意programming to interface之类的准则,因为面试里面会问到!
学好英语
个人背景:本科非CS,研究生CS。LeetCode刷了500道题左右,刷了5-6遍,第一次刷的时候一天做题加看答案只能做20道题。最后两遍刷的时候,weekly contest的medium可能就要5-10分钟。到这个程度的时候个人认为onsite的算法题已经不是任何问题了,FG的面试很随意了。
https://www.zhihu.com/question/31092580/answer/742703012
LeetCode
实习生,想分享自己一点经验,让你们少走一点弯路!还有, 我不是大神, 只是喜欢敲LeetCode
的小学生!首先, 大多人说自己没有编程基础, LeetCode
太费力!其实这个完全不用担心, 因为我就是零基础,在敲LeetCode
甚至连一门编程语言都没学过(只会一点python
)!什么BFS
,DFS
,动态规划
。。。什么都不懂!LeetCode
还是通过我找工作小伙伴知道的, 之后一发不可收拾。所以没有编程基础完全可以刷,但是要掌握一些方法(后面我会介绍)。
其次, 敲LeetCode
没用, 还是找不到工作;能不能找到工作我不知道,但是我确确实实从中得到一些好处,把它用于生活中。
独立解决问题能力,编程能力相当与解决问题能力, 长时间编程能力的锻炼, 可以提高解决问题的能力。生活中也会遇到困难, 我总会习惯性去想办法解决, 相信方法总比困难多。
思维能力, 编程时候我们要把所有可能性想到,会有好多边界情况, 需要考虑极端情况;这个思维也可以用在生活中,我会下意识想到这个问题发展最好情况,最差情况。。。想办法解决各种情况,所以考虑问题会很全面,做起事来游刃有余。
专注能力,现在是娱乐至死的时代,能静下心做的事越来越少。当你做题思考时候,你必须要沉静其中,让心流遍布全身,那种感觉真的很舒服!这种快乐不是那些及时快乐相比的。现在最值钱的不是时间,不是金钱,而是你的专注力。资本剥削就是剥削你的专注力...反正专注能力很重要,值得锻炼。
时间空间, 编程时候我们总是尽可能节省空间, 时间做到一点也不浪费!在生活中, 你也会无意识去思考这些, 让自己更快,更好完成它。如何用空间换时间,用时间换空间?相对于最少资源得到最大利益,让自己生活飞起来。
还有,很多很多。。。
最后,还要人说LeetCode
太难了, 自己太笨做不了。天赋决定上限,努力决定下限。先努力做到目前你能做到的最好,然后再说不行。要相信一万小时定律
,傻子都能成为天才。我们先试一试->
不行->
再坚持一下->
不行->
再坚持一下->
不行->
放弃!做点其他想做的事,人生其实就是在不断的尝试,才能找到自己想走的路。开心才是最重要的,改变世界就是那几个人,大多数人渺小到可有可无,我们能做到就是让自己开心,让自己生活有意义!
LeetCode
方法,大家可以借鉴。我采取的方法
快刀斩乱码 慢工出细活 坚持
第一步, 快刀斩乱码
LeetCode
标签每种类型做个几题。一开始不知道怎么做,没事!思考十分钟, 想不出来直接看别人代码, 把它的逻辑搞清楚。然后自己手敲一遍(不看他人代码, 自己想逻辑)。这个很关键!不去思考,看着别人代码敲, 只能练手速, 该不会还是不会!第二步, 慢工出细活
第三, 最重要坚持
LeetCode
,每天两题,一开始需要4,5
个小时,随着你每天练习,时间慢慢变短,而且肉眼感受到自己的进步!很有成就感!人只所以坚持, 是他认为有意义, 把敲LeetCode
赋予重大意义, 每个人都可以!再写一点建议,
LeetCode
都是水题,可能一辈子我也达到不了这种水平, 但是每天让自己大脑处于思考情况, 做事逻辑清楚,还有它给我带来内心平静,感觉世界很静,自己很舒服!其实就够了!我们在敲的时候,养成一些好习惯。我们毕竟不是acmer
, 不需要刻意追求速度, 养成见名知意变量命名习惯;养成写注释的习惯;养成估算自己算法时间复杂度,空间复杂度(我还要锻炼)习惯;。。。。别看这些一开始很难, 当你养成习惯了,以后都是无脑事情,一点也不累!
真的希望大家, 不是为了面试而找敲算法,而是培养自己喜欢思考的习惯!让自己一直处于进步状态!算法不仅仅只属于计算机,生活中处处都能看到, 你玩的拼图游戏(DFS
)。。。都是算法.
https://www.zhihu.com/question/31092580/answer/487445817
第一遍刷的什么都没记住,花了半年。
第二遍研究生入学刷的,有的题感觉都没见过,剩下的有印象,但是我发现我的解法和第一次都差不多。中间面了微软on campus挂了,是真的菜啊。
第三遍是拿了Google面试,只刷狗家tag下边的题,高频题刷了两遍,面经又过了一遍,背靠背第二面咖喱英语的follow-up没听懂,挂了,很气。
后来面Facebook,那时候tag有128道题,我刷了108道,保守估计每道题3遍,包括手打两遍,白纸一遍。没有遇到一个国人面试官,一面电面,美国人,两道medium,二面onsite三道题,因为我说我见过3sum,面试官在我说完思路之后就换题了 。过了。
后来我帮别人mock,真的很急,挑的easy和medium,要么给的不是最优解,要么卡在代码实现细节里。
个人认为:
作者:糖长老
https://www.zhihu.com/question/31092580/answer/441049272
刷leetcode最好的方法就是给自己定个时间,超过了就果断看答案,理接答案,按照答案的思路自己编一遍。刚开始刷leetcode重点不在于独立解题,而在于迅速把所有的题刷三到四遍,后面遇到新题就自然会有思路,可以迎刃而解了。
所谓书读百遍,其义自见,说的是很有道理的。其实这也是学习进入一个新的领域的最有效方法。
https://www.zhihu.com/question/31092580/answer/618541259
一开始必然拼写错误,数据测试不通过啥的。慢慢校正,无疑是对python语言的一个巩固,也被坑了无数次边界检查。
后来,惊讶于python如此作弊的函数与方法,迭代器啊,列表方法啊,字典啊,通过看《Python基础教程》学到了很多。
再后来,看了不少大佬们的解答,知道自己比较欠缺的是数据结构还有算法。借了一本很简单的书,简单体会了比如分治还有动态规划,然后盯着DP标签的题做,突然有一天似乎明白了这种思想的含义,真是体会到了什么叫醍醐灌顶。数据结构中的链表和二叉数也是,在明白了python如何模拟数据结构(这是我在测试界面看到了网站帮我们写好的代码,才整明白的),又学了点数据结构后,刷起专题来还是很爽的。
目前就到这个阶段,还没有说看到题能感受到用啥方法的地步,效率也是个渣,每周竞赛那时也做,只能做前两道的渣渣水平。另外用python不少时候能作弊,再用一门语言二刷很有必要啊。
吃力,相当正常,不过个人有几个渣方法:
有一门叫熟练的语言是很重要的,如果语言,数据结构,算法都不熟练,刷Leetcode会有不小的难度。个人推荐python开始,好用一点,不被某些语言上的东西困住。
实在想不出的题看答案也可以,不过多看几个答案,多琢磨,哦!这个想法真的很妙啊!以后也能用上!如果程序通过但效率不行,也可以看其他人的算法,或许是习惯问题,或许是更好的算法。
https://www.zhihu.com/question/31092580/answer/562179059
有些算法思路你不熟悉的话,根本想不出了,想出来也写不出来,写出来也过不了,过得了也不一定是最优的,真的惨。
不过后期看到新题目真的会有一些思路的,实现能力也变强了,最差也能搞个暴搜出来。
对于研发和算法的同学来说,刷题的重要性不言而喻,不刷提你好意思面试么,我自己只是大学学过C语言课,早忘了。三月开始刷题真的是0基础(不过我的编程思路逻辑还是可以的),分享一下刷题的步骤:
打地基阶段:
入门阶段:
目标:算法思想细节要搞清楚,实现的一些细节也要懂,最好对着代码一行一行走几遍。你也许会对很多实现细节不清楚,没关系,多写,多画。
资料:剑指offer,大话数据结构(这个选择着看吧 说的太啰嗦了),leetcode easy的题。
跑步前进阶段:
抱佛脚阶段:
刷题的原则就是,广度要够,不要死盯着一个不放。
来源:深度学习与计算机视觉
本文版权归原作者所有,如有问题请联系我删除。