转自:https://www.zhihu.com/question/32322023
刷leetcode是什么样的体验?
75 个回答
看书看累了?刷几题吧~
心慌气短压力大?刷几题吧~
不知道要做啥?还是刷几题吧~
居家旅行,缓解压力,清空罪槽必备良药~
刷Leetcode的主要作用,在我看来,其实是为了维持一种编程状态。
小生在某小国,最近刚刚找到工作。其实开始做LeetCode的时间比较晚,也就是开始投简历那段时间,一天有空刷做个2-3题(两三周刷完的大神请勿打脸),没过多久恰好就有了面试机会,恰好就有笔试,恰好就是考些算法和数据结构,恰好我就通过了。虽然都是恰好,不得不说,如果那段时间不是在刷Leetcode,一小时两道题的笔试我还真说不准能不能写那么顺利。
这是我刷Leetcode时同步在Github上的repo,一直到找到工作为止,一共也才记录了几十道题,目前已经停更一段时间了=.=不过做的时候还是比较用心的...
scottszb1987/LeetCodeInCSharp · GitHub
(是按ac rate从高到低开始刷的,呵呵!)
先声明一下,我不怎么刷 leetcode,只刷过个位数题目吧。主要用 C/C++刷,而且我特别容易放弃,稍微难一点的我就直接搜答案看答案了。
但是 leetcode 说实在体验没有那么好。有不少 testcase 有问题。我当时还反馈过+邮件过,后来才发现我真是 naive 了,搞成这样是有原因的(后文说)。
后来有一天我看到 leetcode 头条上banner 说需要 C/C++ coder 来转录题目和 driver 等等,于是我随便丢了一个邮件。
大概就说了会写 C/C++啥的……
结果第二天对方就会了邮件,而且明文给了用户名密码233……
然后我就抽空搞搞 C++ 转 C,基本上没写几个,因为我那段时间上课比较蛋疼,所以没花太多时间。
附上我那时候的两条微博:
以及最后成果是上了一个 Hall of Fame
前面那几个10+题狂人实在是太神,基本上写东西像切菜一样……实在是牛逼……
然后leetcode 有点像是杭电那个 oj,但是我也不熟悉 oj 的情况(leetcode 是我第一个用的 oj……);lc 以 C++ 作为主要语言,因为历史在这类 oj 里面算悠久,有一些自造的小轮子。
那时候我很好奇 lc 用的是什么技术,可以看看这个帖子:http://www.mitbbs.com/article_t/JobHunting/32821997.html
有一些open source oj是submit后,php直接调用shell script去编译给结果,不需要
给submit id再check.所以我猜leetcode不是采用这
总之不是 docker,我司现在用的是 docker,lc 我在后台研究过,也没太大头绪。
然后 lc 的社区也很有意思……有一种微微的技术友善气息(不太好形容);比如 stackoverflow 会有人说 read the fking ... lc 的社区志愿者基本上会帮你把你挖的坑重写……虽然也会吐槽,但是的确是微微的技术友善气息……
lc 所有语言的题目模块都需要用 c++ 写 driver,driver 来调用一些封装好的小轮子去 check 答案。再深层的比如小轮子怎么造,我又不知道了。
我的帐号在 leetcode 后台只存在了两个月。因为用 c++、c 的人太多了,一个月左右一下子就搞定了好几个问题;于是接下来就转 js 方向的题目转录,我不会写 js,于是就发邮件说好啦你们慢慢忙~~
最后我还看了几眼 bash 方面的讨论。有很多大神在担忧 bash 安全性问题。。。没了
八股定格式而取文采心意,leetcode定题目且重答案背诵。
美其名曰:"practice makes perfect."
为何今不如古?
非也非也,
科举为国取士,leetcode为Google筛码工,各取所需也。
即使全部AC了,面试当场写还是写不出啊啊啊!
结论:只刷一遍是不够的。。
当年leetcode才153道题,现在题目数量好像突破200大关了。
刷第一次的时候花了两三个星期,简直是全身心的按摩爽到爆炸。
刷第二次的时候感觉就不一样了,思路比刷第一次的时候清晰很多。
刷完之后感觉还没有参透其中的奥妙,于是乎刷了第三次、第四次、第五次。
刷第六次第七次的时候,一天能刷70+道题。
刷到后边,感觉这些题目已经倒背如流了。
然后歇菜了半年,现在看起来还能记得起其中一部分题目的思路。
刷完之后最大的感受就是:
practice makes perfect
现在已经刷到80+了,做完题还会尝试做各种优化,并且同一题用各种语言再实现一遍,看看效率对比。java永远是最慢的语言,js常常比c#快,让我很意外。
看accept之后的图表也很有意思,c永远是最快的,然而有些奇葩题要用到一些高级数据结构,有时候就会见到一些c程序跑得比java还慢,可见有人造了一个惨不忍睹的轮子。
[1.19.2017] 更新:
2017年1月17日, 陪我征战多年的 2014 MackBookPro i7 3.xGHz 被一杯清水结束了生命,在这里深切缅怀悼念。这个Git Repo是小M陪我一字一句打出来的,有过蹉跎,也有过辉煌,陪我从Day1刷题一直刷到了Day1之中。直至今日,小M记录的代码还在给广大coder带来福利。为了延续小M无私奉献的精神,我将重新在这个repo活跃起来,重整已有的问题,也会尝试总结一些System Design方面的想法,将小M还没有能够达成的梦想实现。
原帖:
先贴一个福利:GitHub - shawnfan/LintCode: Java Solutions to problems on LintCode
然后再慢慢谈刷题的经验。
地点西雅图。
这一场算是彻头彻尾的胜利。归功于一年来的刷题。归功于不输阵的心态。归功于日渐成熟的谈吐。更归功于身边人的支持。等待了一年多,我对这场胜利真的期待了太久。
刷题是漫长的路,身边的人能陪伴你,但是从来无法代替你。我刷的最多的是LintCode; LeetCode其实比LintCode要更加严苛一些,在最终的备战时,可以买他们的会员,专门进到各个公司的单元狂刷一下。Flash Back 一下去年刷题的体验:
第一刷的时候完全不知道为什么要做这些事情,只觉得消耗了很多时间,但总不上道。其实什么都没有太刷出来,基本上就是懒洋洋地做题,看看别人的解答,一轮一轮地打击自己的信心。到头来,也只看了100来道题目吧。
第二刷时,完全是因为有最牛逼的公司递来了橄榄枝。那时我又兴奋又紧张,更多是紧张,因为自己真的是半瓶子醋啊!(说实在的,谁平时会没事一直练刷题呢,都是为了工作,都是需要动力的)这时开始仔细的看LeetCode还有LintCode里面的题目,分等级开始安排时间。面试的时间定在了一个月,还剩三十天!这三十天真实打了鸡血地不停刷题,战斗,总结,然后再上。到结尾的时候,大约有200道题目吧,其中100道是之前已经做过的。
然后,就失败了。
第三刷,是来年,我还在无奈的痛苦中,但也到了春暖花开,各个公司撒网的时候了。这一年Facebook, LinkedIn貌似都不太有动静,Twitter也在暴跌40%的痛苦中。苦苦等待,又来了几个机会,这一次,我没有冲动地定下30天的计划,但是依然充满了鸡血。这一边,仔细讲一讲吧,说说也能算是面经。
1. 把真的想去的公司,稍微排在后面一点,一般的公司,放在前面先去,当然是增加面试经验了。 心态还是要端正的:你想,要是后面的公司全都不要你,那么你去哪,废话,当然是去第一家要你的公司;所以,在这个时候要卯足力气,打好鸡血,做做全面的复习,然后上!
2. 心态要好:成败都是这几个月的家常便饭,失败了再走下一个。成功了也要看清自己的目标不要懈怠(虽然我拿到offer立刻就懈怠,后面的面试全部当做旅游)
3. 刷题要有策略。正所谓磨刀不误砍柴工,不要一味地钻进题目里面刷刷刷,复习复习复习,重点是要能总结! 有时候这种废话听上去一点力度都没有,但是实际情况就是那么简单。 咱们刷刷题就能找到工作的这个时代,远远不到拼智商的程度。 那拼什么?拼耐心和拼谁更加不浆糊。 刷了那么久,到底哪些题目是Tree, 哪些是DP,哪些是明显的坑?如果你到现在还没有总结,那。为。什。么。不。总。结! 不总结自己到底做了什么题目,脑子里就是一团浆糊。面试的时候可紧张了,我们这样的小青年,见到面试官肯定羞射,若不胸有成竹,写出来也是一团浆糊。 所以重中之重,就是要学会总结,学会去反思做过的题目。现在的LeetCode(竟然总结了题目开始卖钱我去!?), LintCode都会给出相应的Tag, 这非常好,就是帮助你把题目归类,分类型去刷。
4. 分类型,一个大块一个大块地去攻克。就这么简单。从简单的String, List, Tree 开始吧。
5. 我当时还是花钱买了LeetCode的那些题目的(羞。。。)因为求胜心切,这点小钱,就几个月,花吧,花吧。 这也是对自己的一种投资,也是一点动力,花了钱嘛,make evey peny count!
但是,有一件事情我要说清楚了:这些题目明明都是我们这些草民玩家通过一次次血淋淋的面试换来的宝贵经验,凭什么LeetCode就要拿过去卖钱... 当然, LeetCode提供的服务是特别好的, 他们的test case更加难,比LintCode要严苛一些(对我们自己好),所以charge一些费用也是应该的。但是,我真的觉得知识不应该被用来贩卖,知识应该共享,而你们网站提供的优质刷题环境,可以用来卖会员,比如说,我买了会员,你给我提供快两三倍的run speed等等。。。。。
一颗热爱Open Source的我,自然会好好‘总结’一把。跟网上大部分的大神不同,我不喜欢把我总结的题目都放在Blog里面,实在是,太难搜索了。
我把我做的所有题目都放在了GitHub上, 用我自己的标记方式,写好了题目梗概,自己在每个阶段的解法,在每个题目文件的最上方,还用中文写了用来Trigger Memory的笔记(别问我为什么用中文写:1. 中文容易提醒自己,母语嘛!2. 我不想让阿三门都跑过来看,虽然,open source吧,我还是稍微给一道语言的隔阂)
话都说到这个份上了,你们自己去不去看,就是你们自己的选择啦。用我的代码没问题,要是转我的代码,麻烦在你们转发的帖子上面贴一条我源代码的链接就好啦。 大约三百来道题目吧,你们在刷Lint或者Leet的时候,可以去我的页面搜索题目的名字。300多道,差不多中等的题目都能涉及到了(我去别跟我说现在题目都500多了,我真不明白,以后还让人怎么活!) GitHub - shawnfan/LintCode: Java Solutions to problems on LintCode
LeetCode, LintCode都很好,但刷题的核心是要有血性,会总结。
我的初衷就是想把自己做过的刷题路分享给还在题海的中国同伴,如果你们在看到那些解答,觉得不对,觉得幼稚的时候,send me a fix and pull request,我会定时接受代码的更新,服务大众嘛!
总体感想就是。。程序员的水平差距往往体现在智商而不是编程基本功上。。。而智商想要提高还是比较困难的。。
过两年回国创业or啃老or摆地摊。不想把宝贵的时间和脑子用在这些事情上面了。
ps。我刷题的时候才130题左右。
觉得这是最美的单词。。。
感觉智商不够用。不过会继续努力刷题的。。。
————————————————
130题了~
medium里边比较简单的也快被刷完了~
不过最近没刷了,而且LeetCode的题最近涨的好快。。。
如何正确的刷:
- 适当刷简单题只能保持编程的手感
- 刷适当符合或超过自己能力的题,或者重点专攻某一薄弱环节,比如Tree,Sort,Graph,Dp。过了小白阶段可以不要那么看重ac数目。
- 讨论区啊,看热门的答案,优雅的算法,优雅的代码
- 还是讨论区,参与讨论,对自己比较熟悉的算法解答一些疑问,在讨论中进一步学习。
一起努力吧
然而別人都在強調盲寫代碼+肉眼debug。
看到這個問題,發現新題240出了。
於是我體驗了一下盲寫。
……納尼啊我的程序只有16行……
肉眼看了三遍還是沒看出錯誤……
無奈之下複製到本地……
並沒有語法錯誤……
主要是因为 Python 本身比较简洁,再加上一些语法 trick,让人眼前一亮。
比如这题 Compare Version Numbers 的一种解法:
class Solution:
# @param version1, a string
# @param version2, a string
# @return an integer
def compareVersion(self, version1, version2):
v1 = map(int, version1.split("."))
v2 = map(int, version2.split("."))
v1.extend([0] * (len(v2) - len(v1)))
v2.extend([0] * (len(v1) - len(v2)))
return 0 if v1 == v2 else {True: 1, False: -1}[v1 > v2]
首先是下面这个题:
然后我随手写了个
然后就……
要是对每道题能限定是否用STL就好了。有些题目就是考基础的数据结构,用STL就没意思了。有些题目则是考算法和想法,用用STL无可厚非。
还有就是 leetcode上面的什么3sum 4sum这类题 我用hash从来都是TLE,然而用复杂度高一个量级的算法却能AC,真是不知道说什么好。
然后就是不知不觉一个上午没有了,甚爽;不知不觉一个下午没有了,甚爽;不知不觉一个晚上没有了,甚爽……
当然,甚爽的过程包含被leetcode神奇的测试用例逼疯然后改好的过程;
我这个人天生执着,就是不看别人的解答,实在想不出来怎么办我就搁置做别的,然后时不时的拿出来试试,时不时拿出来试试,直到解决。解决得那一刻就会觉得很开心
不过,目前仍然有很多题前面挂着问号,就是写好了没有通过测试用例的
后来,论文是必须看的,leetcode也越来越难刷,于是,快一年没刷了