一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1481|回复: 19
收起左侧

[其他] 每次刷题是不是一定要做到AC?

[复制链接] |试试Instant~ |关注本帖
burself 发表于 2016-8-13 18:37:30 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
刚才调一个小程序,花了半个多小时,各种打log,最后发现是漏了一个else:
                                }if(prev && prev == cur->right){
                                        stack.pop_back();
                                }else{
写的时候图省事从前面一段程序copy过来的这一小段code,结果忘记加else了,格式缩进还很有迷惑性,所以半天没发现。
排除这种笔误带来的bug往往很花时间,而且感觉对自己没有什么明显提高,所以请问诸位是不是每次刷题一定要做到AC?
sheepmiemies 发表于 2016-8-15 23:51:55 | 显示全部楼层
本帖最后由 sheepmiemies 于 2016-8-16 06:46 编辑
burself 发表于 2016-8-15 15:40
你说的有一定道理。我也知道不少ACM OJ选手对常用算法都是倒背如流的。但我觉得对准备面试来讲,还是要找 ...

LZ你这有点偷换概念,AC,最优解,倒背如流,这几个不是一个层次的。

AC,可能只是代表你刚好做出来了,(1)你的代码可能很冗长,(2)效率可能很低,(3)再做一遍你未必做的出来。
最优解,也可能只是代表你的方法big O最优,甚至少数题只是你见过的最优,还有可以优化的点,仍然可能精简/优化代码,并且隔一段时间再做一次你未必能想到最优解。
倒背如流,看似已经学到头了,但是也有, (1)假的倒背如流,也就是你遇到这道题,比如80%可以很快写出最优解并且bug free,但是follow  up完全懵逼, (2)真正做到理解题目思路,举一反三,遇到同一类型类似的题都能很快找到答案。

做题不仅是做题,是锻炼思维和培养习惯的一个过程,也是建立正确态度的过程,在你看来很弱智或者很平常的思路,在更high level的地方很可能仍然有举足轻重的地位。

个人建议,不喜轻喷。觉得LZ的态度需要改变一下:
1. 你觉得你花30分钟,解决了这么小的一个bug,不过是才AC,你就能倒背如流了吗?或者你觉得你花30分钟把一道easy,medium的题解决得倒背如流,遇到hard也能有同样的效率?
2. 仅仅这30分钟,你能了解多少系统架构?能付诸现实吗?会不会担心变成思想的巨人?
3. 写测试的时间都省了,也就是你懒得去全面地思考各种case,你工作中也是这样的态度吗?如果这样别人怎么可能放心你去架构?
4. 同样已经工作,确实觉得回家了不是很有学习的动力,但是时间挤挤还是有的。确实不同公司加班情况不太一样,这个因人而异;但是我们现在应该是可以大量利用碎片化时间来充实自己,想想可以怎么好好利用闲暇时间才是正道,而不是鼓励自己“能学习已经很难得了”。。。有时候(没太多加班的时候)可能是自己给自己的借口,放松得心安理得。
补充两点,个人认为这两点都不太可取:
1. (推荐LZ认真想想) LC的code一般不长,大多数在30~50行之内。这么小段代码,如果连typo或者一些mismatch这样的小问题都需要检查半个小时,是不是会被怀疑在以后工作中,在庞大的架构下debug都需要更长的时间?
2. 最优解的追求,就如楼下那位所说,是否要盲目去追求最优解?
(1) 如果最优解思路很明显,还是很有必要的,毕竟明显的思路大家都很容易想出来也不会花太多时间,从竞争的角度上说,也不会比别人差得太多,还是有必要的,就不举例了。
(2) 如果最优解太巧妙,超出了自己目前的能力,思考一下就好,开拓下思路总是有好处的,但是没必要花大把时间,mark一下以后回过头来看更有效率。
(3) 不要盲目追求代码极度简洁。。。。没有必要为了简洁完全舍弃可读性。
回复 支持 4 反对 0

使用道具 举报

ladyM1896 发表于 2016-8-16 04:56:21 | 显示全部楼层
很多题目AC是不够的,好在现在LC可以看到自己代码的运行效率和别人的进行比较。如果专注于刷题进度,那么AC了以后如果运行效率基本和大家差不多的,我觉得就可以算这题pass了。

另外说点和楼上几位不太一样的吧,刷题毕竟是为了面试,所以应当以怎么让面试官认可你作为标准。我最近面了几个公司的体会就是,刷题够用就行了,有时候代码就算完成度很低,只要思路对了,面试官一样让你过,甚至评价还不错。(基于我G的电面的经验)。花太多时间追求最优不是一个很经济的做法。而且有时候题做得太顺,会让面试官觉得你无非是刷过这题,反而说你communication不行。举个例子,LC上的Stephen的代码长度基本都是最短速度最快的。仅仅是个人爱好做题没问题,但是面试的时候真的把这种代码写出来有点炫技的意思,代码不太容易读懂。确实也会看到有些人提到做得太快面试官出更难的题,直到被难倒为止。有时候面试官自己都未必对面试题很熟悉,只直到一两个解法,可能还搞不懂你写的代码。

不过楼主这个情况,首先copy paste是绝对不可取的。就我个人而言,做不出来的题目,看一下别人的思路,我也不会立刻去做,这个时候可能思路只是记忆性的,照搬别人的东西做完就忘了。我一定会做点别的题目,第二天再去做之前的题,这样可以尽量确保代码是你自己敲出来的,不是靠看别人的。
回复 支持 1 反对 0

使用道具 举报

RobertCheng 发表于 2016-8-13 22:17:31 | 显示全部楼层
白板的话不需要,但是OA得AC
回复 支持 反对

使用道具 举报

 楼主| burself 发表于 2016-8-15 00:33:49 | 显示全部楼层
RobertCheng 发表于 2016-8-13 22:17
白板的话不需要,但是OA得AC

我的意思是平时做练习需不需要每次都做到AC。。。
回复 支持 反对

使用道具 举报

ryancooper 发表于 2016-8-15 01:02:04 | 显示全部楼层
当然要AC啊,不AC证明你的算法就是错的。所谓的笔误,本来在你写完代码自己做测试的时候就能看出来。如果你要花很长时间,往往是因为没有很好的通读自己的程序,主要你理解自己程序中的每个量的语义,然后看你的实现是否满足这些语义,很快就能检查出来的。这里可以提高你的code review的能力
回复 支持 反对

使用道具 举报

RobertCheng 发表于 2016-8-15 01:05:59 | 显示全部楼层
burself 发表于 2016-8-15 00:33
我的意思是平时做练习需不需要每次都做到AC。。。

平时练习不也是为了OA做准备吗
回复 支持 反对

使用道具 举报

哈哈贼 发表于 2016-8-15 01:20:41 | 显示全部楼层
有这些bug 就是不熟练的表现, 你觉得很浪费时间有时间对于面试官来说就是致命的。等你慢慢debug多了,等你熟练了,有些bug自然就没了。再说你不AC你怎么知道你的算法是对的?
你现在花半个小时修一个bug觉得很浪费时间不去ac。有可能等你上班以后就要花两三天的时间修一个更小的bug?你也不修了吗?
回复 支持 反对

使用道具 举报

 楼主| burself 发表于 2016-8-15 15:40:14 | 显示全部楼层
哈哈贼 发表于 2016-8-15 01:20
有这些bug 就是不熟练的表现, 你觉得很浪费时间有时间对于面试官来说就是致命的。等你慢慢debug多了,等你 ...

你说的有一定道理。我也知道不少ACM OJ选手对常用算法都是倒背如流的。但我觉得对准备面试来讲,还是要找个平衡点。毕竟准备时间还是有限的,不像在学校,有寒暑假,还可以逃课或者找系里请假,有充分的时间反复练习。
首先,是不是需要做到对每一道题的最优解法都做到倒背如流闭着眼写也不会出错?
其次,我感觉如果已经工作了的话,能不加班有点闲暇时间看看书做做题已经很难得。就我个人情况来讲,如果花半小时debug一个笔误只是为了追求最终把解法倒背如流,我可能更愿意把有限的时间花在学习一些新鲜的解题思路,或者了解一些流行的系统架构上。
或许其他人有更加有说服力的理由?
回复 支持 反对

使用道具 举报

 楼主| burself 发表于 2016-8-15 15:46:57 | 显示全部楼层
ryancooper 发表于 2016-8-15 01:02
当然要AC啊,不AC证明你的算法就是错的。所谓的笔误,本来在你写完代码自己做测试的时候就能看出来。如果你 ...

我想说其实我现在连自己写测试的时间都省了,能编过就提交... 但我同意你还有@哈哈贼 的观点,就是熟练度还是很重要的。CR没发现应该也是跟不熟悉这块的逻辑有关系。
回复 支持 反对

使用道具 举报

xietao0221 发表于 2016-8-15 16:10:26 | 显示全部楼层
肯定得AC啊,其实leetcode也不一定每道题的test case都涵盖了所有情况,如果这都不能AC的话,就证明算法一定有问题。就算是算法没有问题,那些笔误也会让面试官觉得你的代码能力有问题。写代码不可能一次通过,每天的debug也是在给自己增长经验。
回复 支持 反对

使用道具 举报

justin 发表于 2016-8-15 17:23:22 | 显示全部楼层
必须得AC。
不AC的话不就相当于你自己安慰自己说你做对了,其实你可能主体思路都没写对呢。

另外,关于debug的问题。建议用有debugger的编辑器,这样的话可以设置断点便于查找问题。比如直接追踪某一变量的value变化。每次看到别人用print来debug C++我就觉得心好累。。。
回复 支持 反对

使用道具 举报

annawuyi 发表于 2016-8-15 20:37:01 | 显示全部楼层
请问楼主AC是什么意思?谢谢
回复 支持 反对

使用道具 举报

runrain 发表于 2016-8-15 22:09:29 | 显示全部楼层
这个问题就好像 每次做测试是不是要考满分 一样 哈哈哈
回复 支持 反对

使用道具 举报

runrain 发表于 2016-8-16 03:03:43 | 显示全部楼层
sheepmiemies 发表于 2016-8-15 23:51
LZ你这有点偷换概念,AC,最优解,倒背如流,这几个不是一个层次的。

AC,可能只是代表你刚好做出来了 ...

每次看您的点评都有十足的进步
回复 支持 反对

使用道具 举报

sheepmiemies 发表于 2016-8-16 06:47:46 | 显示全部楼层
runrain 发表于 2016-8-16 03:03
每次看您的点评都有十足的进步

大家一起讨论一起进步!
回复 支持 反对

使用道具 举报

 楼主| burself 发表于 2016-8-16 21:37:12 | 显示全部楼层
sheepmiemies 发表于 2016-8-15 23:51
LZ你这有点偷换概念,AC,最优解,倒背如流,这几个不是一个层次的。

AC,可能只是代表你刚好做出来了 ...

好吧 我觉得你可能没有太了解我的意思。首先我发这个贴主要是想看看怎样能更加有效的利用时间,相信对其他版友也有借鉴意义。
大概回复一下你吧。
>> 你觉得你花30分钟,解决了这么小的一个bug,不过是才AC,你就能倒背如流了吗?或者你觉得你花30分钟把一道easy,medium的题解决得倒背如流,遇到hard也能有同样的效率?
这个问题并不是看你做到什么程度,而是看你的目的。有人倾向提高熟练度,如果你追求每次都AC,我觉得这种情况下你的目的就是提高对解法的熟练度,极致的结果就是对解法倒背如流。但我倾向于平衡,熟练度固然重要,但我觉得还有更多值得学习的东西。在时间有限的情况下单纯追求熟练度恐怕不是最好的做法。所以我个人并不倾向把解法做到倒背如流,这点希望你明白。
>>  仅仅这30分钟,你能了解多少系统架构?能付诸现实吗?会不会担心变成思想的巨人?
这里就是你有偷换概念的嫌疑了。一道题多花30+分钟,3道题就是一个半小时。你每天下班到家可利用的时间也就三个多小时而已。我说学习系统架构有什么问题么?G家的老三篇新三篇诸位了解多少?paxos raft呢?LSM tree的论文读了吗?leveldb的源码看过吗?storm, spark的架构?我只能说可以学习的东西太多了。
>>写测试的时间都省了,也就是你懒得去全面地思考各种case,你工作中也是这样的态度吗?如果这样别人怎么可能放心你去架构?
我只是不想花时间去写测试代码,但有什么样的case自己心里还是要有数的。至于我工作中是什么情况自有我的老板和同事来评价。
>> 同样已经工作,确实觉得回家了不是很有学习的动力,但是时间挤挤还是有的。确实不同公司加班情况不太一样,这个因人而异;但是我们现在应该是可以大量利用碎片化时间来充实自己,想想可以怎么好好利用闲暇时间才是正道,而不是鼓励自己“能学习已经很难得了”。。。有时候(没太多加班的时候)可能是自己给自己的借口,放松得心安理得。
呵呵 我还真不是觉得“能学习已经很难得了”,或者说缺乏动力。恰恰相反,我是觉得动力很足但相比要学的东西来说,时间真的不够用。

>>1. (推荐LZ认真想想) LC的code一般不长,大多数在30~50行之内。这么小段代码,如果连typo或者一些mismatch这样的小问题都需要检查半个小时,是不是会被怀疑在以后工作中,在庞大的架构下debug都需要更长的时间?
谢谢你指出来,我个人觉得这个说白了还是熟练度的问题。我前面帖子也说了,code review时间长依然是对常见逻辑不熟悉。二分查找从被提出来到第一个正确实现被写出来,中间隔了10年时间。是那个年代的程序员不聪明么?
你说的庞大架构下DEBUG在哪家公司都是个问题。都不用说庞大架构了,稍微烂点的实现就够后来者喝一壶了。为什么程序员都倾向写新模块,而不是去debug现有的模块?
>>2. 最优解的追求,就如楼下那位所说,是否要盲目去追求最优解?
>>(1) 如果最优解思路很明显,还是很有必要的,毕竟明显的思路大家都很容易想出来也不会花太多时间,从竞争的角度上说,也不会比别人差得太多,还是有必要的,就不举例了。
>>(2) 如果最优解太巧妙,超出了自己目前的能力,思考一下就好,开拓下思路总是有好处的,但是没必要花大把时间,mark一下以后回过头来看更有效率。
>>(3) 不要盲目追求代码极度简洁。。。。没有必要为了简洁完全舍弃可读性。
这几点说的很好,我完全同意。
回复 支持 反对

使用道具 举报

sheepmiemies 发表于 2016-8-17 00:03:09 | 显示全部楼层
burself 发表于 2016-8-16 21:37
好吧 我觉得你可能没有太了解我的意思。首先我发这个贴主要是想看看怎样能更加有效的利用时间,相信对其 ...

额,从你的回复来说,我个人主观上又有两点小看法,如果说得不好,请LZ就把我当成“对你有偏见的同事”来处理。
1. 你的表达一直在变,让人不知道从何去理解你的意思,挺影响沟通效率的。从你的原帖和回复的帖子,举例来说:
(1)“我觉得你可能没有太了解我的意思。首先我发这个贴主要是想看看怎样能更加有效的利用时间,相信对其他版友也有借鉴意义。”你的原贴只问了“刷题是否一定要AC”完全没有看出来“除了刷题,是否可以做其他事情效率更高”的意思。
(2)“这里就是你有偷换概念的嫌疑了。一道题多花30+分钟,3道题就是一个半小时。”你并没有告诉我,你每道题原来都多需要30+分钟啊。。。如果你说你一天三道题,"每道题都要多花30+分钟",我一定不会有偷换概念的嫌疑的。算上额外的时间,如果你每天刷三道题都要超过三个小时,那么省下来的时间学期其他东西是挺够的。然后如果(1)你刷题不是为了找工作 或者 (2)你觉得不用AC你面试也能过,那把时间拿去学更有用的东西,完全同意。同时,大家是在就事论事,讨论AC的问题,不代表只有你一个人回去看书读paper,这一点也不用操心。


2. LZ更倾向于接受两种观点,显而易见非常有说服力,或者和你的想法不谋而合。当然对大多数人来说多少都会这样。
(1)我觉得LZ还是没有认真看我的回帖,我强调的是"刷题不仅是刷题,更重要的是培养思维和习惯的过程",这里的思维习惯不仅仅是思维灵活,容易有新的思路,而且也是有查缺补漏归纳总结的习惯。寻求更好的解属于前者,而当AC都无法做到的时候,算不算学会了这个算法呢(这里不否认有些LC题有一些神奇的test case)?换句话说,当你看算法导论看paper理解了一种算法以后,你写不出来正确能run的代码,算学会了这种算法吗?AC,尤其是第一次AC,离倒背如流的距离还很远吧。30分钟的debug,不能让你做到倒背如流,这一点我也希望你明白。归纳总结不同的方法以及debug和test属于后者。然后如果LZ你认为你全凭思考心里有数不需要实际测试代码就能cover所有case,那ok,当我没说。
(2)你再次偷换了一个概念或者说转移了话题,不要把“创造算法”和“应用算法”的难度混为一谈。我们现在要AC的题,不过是在利用前人已经实现的算法而已,这一点上是没资格和别人相比的,不理解你举例的意义何在。
(3)渣实现不是你能决定的,写新模块还是维护旧模块在你不是老大之前也不是由你决定的,为什么程序员倾向写新模块还不得不去维护旧模块?为什么现在有各种版本的新浏览器,程序员还不得不去考虑老旧版本IE的兼容性?






回复 支持 反对

使用道具 举报

 楼主| burself 发表于 2016-8-17 01:50:46 | 显示全部楼层
sheepmiemies 发表于 2016-8-17 00:03
额,从你的回复来说,我个人主观上又有两点小看法,如果说得不好,请LZ就把我当成“对你有偏见的同事”来 ...

>>”你的原贴只问了“刷题是否一定要AC”完全没有看出来“除了刷题,是否可以做其他事情效率更高”的意思
正因为标题并没有说明我的意图,所以才特意声明一下,通常了解一个人提问题的意图难道不是有助于更好的回答问题吗?
>>”你并没有告诉我,你每道题原来都多需要30+分钟啊。。。如果你说你一天三道题,"每道题都要多花30+分钟",我一定不会有偷换概念的嫌疑的。
好吧 既然打比方你还是不明白,我就这么说吧,一道题30分钟不多,那10道题300分钟多不多?你也不用纠结我切一道题是10分钟半小时还是一小时,讨论这个意义并不大。
刷题说到底还是为了通过面试对不对?虽然刷题是主要手段,但也不是全部。前面不是还有5刷没过跑来哭诉结果被Warald批评的例子? 所以回到准备面试这个大前提,假设你时间有限的话,怎样分配利用更有效,是全部分配在提高熟练度上还是有更好的策略?这才是我问这个问题的主旨。这里是刷题版,你非要说这个问题偏离版面主旨也可以,但我觉得讨论这个问题对版友还是有帮助的。
(1)我觉得LZ还是没有认真看我的回帖,我强调的是"刷题不仅是刷题,更重要的是培养思维和习惯的过程"...
这点就见仁见智吧,我并没有说debug和test对提高个人思维就毫无帮助。
>>2)你再次偷换了一个概念或者说转移了话题,不要把“创造算法”和“应用算法”的难度混为一谈。我们现在要AC的题,不过是在利用前人已经实现的算法而已,这一点上是没资格和别人相比的,不理解你举例的意义何在。
二分查找思想很简单吧,论文也写的很明白吧,实现一遍显然谈不上“创造算法”。但写不对是为什么呢?我举这个例子的意思依然是practice makes perfect,即使是看起来简单的代码也是如此。这点应该不难理解。前面版友也说了,做不对就是熟练度不够。
>>(3)渣实现不是你能决定的,写新模块还是维护旧模块在你不是老大之前也不是由你决定的,为什么程序员倾向写新模块还不得不去维护旧模块?为什么现在有各种版本的新浏览器,程序员还不得不去考虑老旧版本IE的兼容性?
我举这个例子意思是debug从来都不是一件简单容易的事,即便花费大量时间也是很正常的,刷题也许在某些场景下能帮助你理解对方的逻辑,但依然改变不了这个事实。


回复 支持 反对

使用道具 举报

sheepmiemies 发表于 2016-8-17 02:53:27 | 显示全部楼层
本帖最后由 sheepmiemies 于 2016-8-17 02:55 编辑
burself 发表于 2016-8-17 01:50
>>”你的原贴只问了“刷题是否一定要AC”完全没有看出来“除了刷题,是否可以做其他事情效率更高”的意思 ...

我上一个帖子想要说的意思,仍然是我接下来要说的话:
1. LZ你之前的回帖和你后续表达的意思有出入,有一点影响沟通效率。
(1) 我并没有说你解释得不对,而是说你的原贴没有表现出"想要探索高效利用时间做其他事情而不仅是刷题"的想法,原帖你只是和大家讨论"是不是一定要AC"。
(2) 是因为你在强调我偷换概念的嫌疑,我的解释是"如果你每道题总是这样花额外30分钟的时间,确实你能够利用的时间会很多",这一点和你说十道题300分钟很多是一个意思,只是前提是你"总是要额外花那么多时间做一道题"。
(3) 你反问我"为什么程序员都倾向写新模块,而不是去debug现有的模块?",我的回应是,"在你不是老大之前,维护已有的代码很可能是必须的",没有get到你反问的点何在。
(4) "二分查找从被提出来到第一个正确实现被写出来,中间隔了10年时间。是那个年代的程序员不聪明么?"这一点上我真没看出来这个例子practice makes perfect的意思。


2. 我也从来没说过这个帖子歪楼/不应该在这个版面啊,我一直都说的是对刷题的看法而已,那我们回到以面试为目的:
(1) 之前的帖子我说过了,对一道题来说,AC,最优解,倒背如流是三个层次。而你说的熟练度,那是要追求最后一个层次了,比如有些人说的"medium的题,80% 一遍bug free",这里不是让你一遍bug free,而是debug出来AC这道题。AC都达不到,可能会被算作是没有做出题,不敢说所有面试官,但是大多数面试官的眼里,有bug的代码,是不能算做出来的吧?
(2) 你举例的那个刷题五遍的例子没错,所以我之前的回复就强调了 "刷题更重要的是培养思维和习惯的过程"。首先,基本的算法你能写出来,不一定要bug free,但是你有良好的习惯帮助你在短时间内debug出来;然后更厉害的是有灵活的思维触类旁通,面试中的各种follow up和变式都能逐渐找到思路得到答案。在面试中花很多时间debug,面试官的眼里有可能是red flag这一点没错吧?我相信至少一部分面试是没法通过"口述解法"通过面试的吧?就算知道再多的思路,会再多的架构,面试题写不好还是没法通过面试的吧?


再次强调一下,我说刷题是为了"培养思维和习惯",能够尽量快地接近答案,同时我说"良好的习惯去debug和cover corner case很重要",为了validate your solution,我认为这两点对通过面试很重要。我是认为需要"有意识地去提高",而不是"被动的提高熟练度"。同时我不认为逐渐养成良好的习惯之后,会“总是花30+分钟的时间才能找得出typo或者小bug”。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-7 06:05

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表