刷 LeetCode 吃力正常吗?

极客挖掘机

共 6981字,需浏览 14分钟

 · 2020-07-28

链接:https://www.zhihu.com/question/31092580
编辑:深度学习与计算机视觉
声明:仅做学术分享,侵删

C++ primer plus 过了一遍,今天做了 LeetCode 前几题,感觉有点吃力,得在草稿上写的明明白白才能理清思路。听说 LeetCode 只是很简单的算法。
你刷LeetCode吃力么?
作者:迷路
https://www.zhihu.com/question/31092580/answer/54194793
我刚做Leetcode的时候,一道 easy 都要想半天,现在除了大多数的hard,一般都能通过。
大多数的 hard 都是特定领域的问题,如TCP的滑动窗口,编辑距离等。这些如果之前没有做过, 是很难独立完成的。我遇到问题的时候一般到 
水中的鱼 找答案。这个博主是 facebook 的工程的,但有些题目他也没法立即想到答案或者最优解。所以别太灰心,好好做,会有收获的。
建议一次只针对一种题型进行训练,如数组、链表、二叉树、回溯、动态规划,这样效果会更好。
上个图说明我刷得很艰难。。
书籍方面《STL 源码剖析》 和 《算法技术手册》会帮你理解最常见的数据结构,查找和排序算法。

作者:Cat Chen
https://www.zhihu.com/question/31092580/answer/1014282264
吃力是很正常的,我都觉得吃力呢。我至少是中学搞过竞赛的,那时候已经刷了很多题,但现在让我去写 LeetCode 的话还是要花时间的。(我中学靠竞赛保送后就决定不再搞竞赛了,所以肯定不如搞 ACM 的人熟练。)

Easy 的题目是不用思考就可以说出来答案的,但实际写的话还是要认真检查各种 corner case 有没有处理好,否则一不小心就有 bug,无法一次提交通过。

Medium 的题目有几种不同的情况,有些是问题比较难解决,有些是代码写起来超级复杂。对于前者,会需要花一定的时间想想怎么解,有可能能把题目转化为其它已经已经做过的题目。对于后者,需要花时间思考怎样写的代码能够覆盖所有 corner cases 但又 maintainable,而且写完不仔细检查很容易在某些地方留下小 bug,就变成了要通过多次提交来排 bug。

Hard 的题目就随缘吧,反正大概有一半是做不出来的。

因为我面前端,大多数公司面前端的问题都不是 Hard 的算法题,更多是 Easy 或者 Medium 的难度加上必须要有真实前端经验才能解决,所以我不会去刻意刷题。

「必须要有真实前端经验」是什么意思呢?例如说在大多数 JavaScript 引擎里面,比较两个字符串是否相等是 O(1) 而不是 O(n) 的操作,这个你知道就是知道,不知道就是不知道。如果你做过 JavaScript 性能优化,或者至少是做过性能分析来找瓶颈,那你很有可能遇到过这类问题从而知道这一点。

不过有一个事情是这样子的:其实在面试时,你不一定要做到最优解,你可以有些小 bug 但最好你自己能检查出来然后改对。(面试更看重的是跟面试官一起解题的能力,而不是独自一个人写出完美解的能力。很多人理解不到这一点,因为这跟学校的考试规则完全不一样。细节参考我其它答案。)所以在训练时对你自己要求更高一些,到面试时就可以放松做。

总之这个事情你可以理解为跟训练跑马拉松差不多。今时今日已经有很科学的马拉松训练方法,能让绝大多数人在一个月到几个月的时间内从零开始训练到能够跑完马拉松(合理时间内跑完)。这个过程大多数人只有有意志力都能坚持下来,但不代表它不痛苦。


作者:赵瑜
https://www.zhihu.com/question/31092580/answer/477447691
正常。楼主应该还想问怎么刷这类oj比较合理,下面是个人一些经验,仅供参考。
首先要确定刷题的目标,如果不是为了面试,那么节奏完全可以个人把握。如果是面试那么个人以为很多答主的方法实际上是有问题的。
  1. 每道题要有time constraint。大部分oj的题目如果需要想+写超过半小时,那就等于完全不会。实际面试中(任何考试中),你碰到的题目是不可能让你做超过1天的。所以每道题必须掐时间做,做不出来直接看答案,之后码一遍AC的代码。第二天重新做!!!

  2. 大部分Hard难度的题、brain teaser,个人以为是面试的帮助都不大。因为刷题的目的不是碰到原题,而是解决思路相似的题目。LeetCode hard难度题目难度远大于个人面FG new grad时候的题目难度。实际上FG new grad的phone interview 以及onsite难度个人以为属于medium里面比较容易的。

  3. 难以复现(以类似思路出现)的题目看看就好了。2里面的题目个人就是属于这种情况,个人认为easy里面一些math的题目,都基本不具有参考价值。

  4. 除了题目里面的算法内容,刷题还是需要注意些基本编程规范的,毕竟大部分公司面试都不会只让你写pseudo code。注意programming to interface之类的准则,因为面试里面会问到!

  5. 学好英语

个人背景:本科非CS,研究生CS。LeetCode刷了500道题左右,刷了5-6遍,第一次刷的时候一天做题加看答案只能做20道题。最后两遍刷的时候,weekly contest的medium可能就要5-10分钟。到这个程度的时候个人认为onsite的算法题已经不是任何问题了,FG的面试很随意了。


作者:九四干
https://www.zhihu.com/question/31092580/answer/742703012
写在前面的话:
大家好, 我是敲了1年LeetCode实习生,想分享自己一点经验,让你们少走一点弯路!还有, 我不是大神, 只是喜欢敲LeetCode的小学生!

首先, 大多人说自己没有编程基础, LeetCode太费力!其实这个完全不用担心, 因为我就是零基础,在敲LeetCode甚至连一门编程语言都没学过(只会一点python)!什么BFSDFS动态规划。。。什么都不懂!LeetCode还是通过我找工作小伙伴知道的, 之后一发不可收拾。所以没有编程基础完全可以刷,但是要掌握一些方法(后面我会介绍)。

其次, 敲LeetCode没用, 还是找不到工作;能不能找到工作我不知道,但是我确确实实从中得到一些好处,把它用于生活中。

  1. 独立解决问题能力,编程能力相当与解决问题能力, 长时间编程能力的锻炼, 可以提高解决问题的能力。生活中也会遇到困难, 我总会习惯性去想办法解决, 相信方法总比困难多。

  2. 思维能力, 编程时候我们要把所有可能性想到,会有好多边界情况, 需要考虑极端情况;这个思维也可以用在生活中,我会下意识想到这个问题发展最好情况,最差情况。。。想办法解决各种情况,所以考虑问题会很全面,做起事来游刃有余。

  3. 专注能力,现在是娱乐至死的时代,能静下心做的事越来越少。当你做题思考时候,你必须要沉静其中,让心流遍布全身,那种感觉真的很舒服!这种快乐不是那些及时快乐相比的。现在最值钱的不是时间,不是金钱,而是你的专注力。资本剥削就是剥削你的专注力...反正专注能力很重要,值得锻炼。

  4. 时间空间, 编程时候我们总是尽可能节省空间, 时间做到一点也不浪费!在生活中, 你也会无意识去思考这些, 让自己更快,更好完成它。如何用空间换时间,用时间换空间?相对于最少资源得到最大利益,让自己生活飞起来。

  5. 还有,很多很多。。。

最后,还要人说LeetCode太难了, 自己太笨做不了。天赋决定上限,努力决定下限。先努力做到目前你能做到的最好,然后再说不行。要相信一万小时定律,傻子都能成为天才。我们先试一试->不行->再坚持一下->不行->再坚持一下->不行->放弃!做点其他想做的事,人生其实就是在不断的尝试,才能找到自己想走的路。开心才是最重要的,改变世界就是那几个人,大多数人渺小到可有可无,我们能做到就是让自己开心,让自己生活有意义!

好了, 下面介绍我敲LeetCode方法,大家可以借鉴。

我采取的方法

  1. 快刀斩乱码
  2. 慢工出细活
  3. 坚持

第一步, 快刀斩乱码

就是一个字, 一开始刷的时候, 不知道有哪些算法?我们可以按照LeetCode标签每种类型做个几题。一开始不知道怎么做,没事!思考十分钟, 想不出来直接看别人代码, 把它的逻辑搞清楚。然后自己手敲一遍(不看他人代码, 自己想逻辑)。这个很关键!不去思考,看着别人代码敲, 只能练手速, 该不会还是不会!
我们迅速把各种题型过一遍,做到心里有数。

第二步, 慢工出细活

就是一个字慢,对于一个问题, 我们考虑它的各种解法,去总结, 发现其中规律 。

第三, 最重要坚持

我当时刷LeetCode,每天两题,一开始需要4,5个小时,随着你每天练习,时间慢慢变短,而且肉眼感受到自己的进步!很有成就感!人只所以坚持, 是他认为有意义, 把敲LeetCode赋予重大意义, 每个人都可以!

再写一点建议,

我们不是天才, 真的有些大神周赛 10分钟就敲出来了, 我认识一个大神(周赛前几名),他认为LeetCode都是水题,可能一辈子我也达到不了这种水平, 但是每天让自己大脑处于思考情况, 做事逻辑清楚,还有它给我带来内心平静,感觉世界很静,自己很舒服!其实就够了!

我们在敲的时候,养成一些好习惯。我们毕竟不是acmer, 不需要刻意追求速度, 养成见名知意变量命名习惯;养成写注释的习惯;养成估算自己算法时间复杂度,空间复杂度(我还要锻炼)习惯;。。。。别看这些一开始很难, 当你养成习惯了,以后都是无脑事情,一点也不累!

真的希望大家, 不是为了面试而找敲算法,而是培养自己喜欢思考的习惯!让自己一直处于进步状态!算法不仅仅只属于计算机,生活中处处都能看到, 你玩的拼图游戏(DFS)。。。都是算法.


作者:冰雪聪明小姐
https://www.zhihu.com/question/31092580/answer/487445817
985CS毕业,来美帝读研,要刷leetcode找实习。我本科不搞ACM,所以算法基础很一般。一共刷了250道左右吧。

第一遍刷的什么都没记住,花了半年。

第二遍研究生入学刷的,有的题感觉都没见过,剩下的有印象,但是我发现我的解法和第一次都差不多。中间面了微软on campus挂了,是真的菜啊。

第三遍是拿了Google面试,只刷狗家tag下边的题,高频题刷了两遍,面经又过了一遍,背靠背第二面咖喱英语的follow-up没听懂,挂了,很气。

后来面Facebook,那时候tag有128道题,我刷了108道,保守估计每道题3遍,包括手打两遍,白纸一遍。没有遇到一个国人面试官,一面电面,美国人,两道medium,二面onsite三道题,因为我说我见过3sum,面试官在我说完思路之后就换题了 。过了。

后来我帮别人mock,真的很急,挑的easy和medium,要么给的不是最优解,要么卡在代码实现细节里。

个人认为:

1. 刷题面试,没有傻人只有懒人,运气不好(遇到老印)只是暂时的。
2. 刷题多的数量多没用,记不住,遍数多才是王道
3.善于总结,背是不可能背的,理解吸收才是正途。
4.刷了leetcode真的能提升代码能力,我之前有想法到实现出来的速度很慢,但是刷过题之后明显能觉得自己比以前棒棒啦!
多刷刷有益无害的 ‍♀️ ‍♀️ ‍♀️

作者:糖长老
https://www.zhihu.com/question/31092580/answer/441049272
对于大部分人,甚至大部分cs科班出身的,第一次刷leetcode都会感到困难。这很正常的。我感觉我们中国学生经常纠结于要不要自己独立把题解出来,最后把自己搞得很抑郁。

刷leetcode最好的方法就是给自己定个时间,超过了就果断看答案,理接答案,按照答案的思路自己编一遍。刚开始刷leetcode重点不在于独立解题,而在于迅速把所有的题刷三到四遍,后面遇到新题就自然会有思路,可以迎刃而解了。

所谓书读百遍,其义自见,说的是很有道理的。其实这也是学习进入一个新的领域的最有效方法。


作者:黄晟
https://www.zhihu.com/question/31092580/answer/618541259
在不想接着化学读博心灰意冷的时候刷了一下,现在由于转硕了又忙不过来了。
当时刷Leetcode来源于组内师兄的推荐,当时基础只有一点python,其它几乎为零。
谈谈感受,虽然自己不怎么打游戏,然而这很像打游戏,每当一道题accepted的时候特别有成就感。

一开始必然拼写错误,数据测试不通过啥的。慢慢校正,无疑是对python语言的一个巩固,也被坑了无数次边界检查。

后来,惊讶于python如此作弊的函数与方法,迭代器啊,列表方法啊,字典啊,通过看《Python基础教程》学到了很多。

再后来,看了不少大佬们的解答,知道自己比较欠缺的是数据结构还有算法。借了一本很简单的书,简单体会了比如分治还有动态规划,然后盯着DP标签的题做,突然有一天似乎明白了这种思想的含义,真是体会到了什么叫醍醐灌顶。数据结构中的链表和二叉数也是,在明白了python如何模拟数据结构(这是我在测试界面看到了网站帮我们写好的代码,才整明白的),又学了点数据结构后,刷起专题来还是很爽的。

目前就到这个阶段,还没有说看到题能感受到用啥方法的地步,效率也是个渣,每周竞赛那时也做,只能做前两道的渣渣水平。另外用python不少时候能作弊,再用一门语言二刷很有必要啊。

目的目前也只是掌握点技能,可以是本业,也可以是辅助工具,就算是爱好也行。除编程训练在,计算机架构,操作系统,计算机网络,数据库,软件工程等等等等也准备好好学。

吃力,相当正常,不过个人有几个渣方法:

每道题做出来了会在小本本上记一笔,像是军功簿,每周看一看,有激励作用。
数学基础还是很重要的,看一本离散数学的书,也要看数据结构还有算法。

有一门叫熟练的语言是很重要的,如果语言,数据结构,算法都不熟练,刷Leetcode会有不小的难度。个人推荐python开始,好用一点,不被某些语言上的东西困住。

实在想不出的题看答案也可以,不过多看几个答案,多琢磨,哦!这个想法真的很妙啊!以后也能用上!如果程序通过但效率不行,也可以看其他人的算法,或许是习惯问题,或许是更好的算法。

练习编程,非一时一日之功,以后上班了,每天刷两三道,感觉会很爽!

作者:要没电了
https://www.zhihu.com/question/31092580/answer/562179059
非常正常,一开始都不会,像个傻子一样,做的第一题是K个有序链表的合并,自己想了好久,觉得思路可完美了,写出来发现怎么都过不了,和舍友讨论一晚上,还是没搞定,两个大傻子呀!!

有些算法思路你不熟悉的话,根本想不出了,想出来也写不出来,写出来也过不了,过得了也不一定是最优的,真的惨。

不过后期看到新题目真的会有一些思路的,实现能力也变强了,最差也能搞个暴搜出来。

对于研发和算法的同学来说,刷题的重要性不言而喻,不刷提你好意思面试么,我自己只是大学学过C语言课,早忘了。三月开始刷题真的是0基础(不过我的编程思路逻辑还是可以的),分享一下刷题的步骤:

打地基阶段:

任务:数据结构,链表,堆栈,队列,树,图,基本概念要清楚,基本操作要熟悉。
目标:这一阶段不必纠结于一些细节,大致了解即可,先学会站,有些难的想不出先放着。
资料:北航数据结构教程 唐发根,小甲鱼 数据结构视频。

入门阶段:

任务:接触一些基本的算法,排序,查找,遍历,深搜,广搜,递归等,多写一些简单题,增强实现能力。

目标:算法思想细节要搞清楚,实现的一些细节也要懂,最好对着代码一行一行走几遍。你也许会对很多实现细节不清楚,没关系,多写,多画。

资料:剑指offer,大话数据结构(这个选择着看吧 说的太啰嗦了),leetcode easy的题。

跑步前进阶段:

任务:深入理解算法思想,增强实现能力,提高解决问题的能力,修炼内功。
目标:各种算法如贪心、深搜宽搜、动态规划的思想要深入理解,提高动手能力。
资料:ledtcode各个算法标签下easy和部分medium的题目

抱佛脚阶段:

任务:为了面试。抱佛脚呀
目标:面试前几天,记住更多的算法题目,读题目,自己想思路,去网上找最优思路,不必实现。
资料:leetcode 牛客各种面经。(我为了面试 最后在一周之内把所有leetcode所有动态规划的题目思路背下来了)

刷题的原则就是,广度要够,不要死盯着一个不放。

排序(快排 归并 堆),查找,牛顿迭代法,TOPK问题,蓄水池抽样问题,位运算这些都要有所涉猎。

来源:深度学习与计算机视觉

本文版权归原作者所有,如有问题请联系我删除。



感谢阅读



浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报