Redian新闻
>
刷题面试应该是必须的
avatar
刷题面试应该是必须的# JobHunting - 待字闺中
S*C
1
看了很多工作十几年的大公司老工程师的代码又臭又长又啰嗦,就知道刷题面试是必须
的。
当然他们赶上了好时候,他们进大公司的时候根本没有刷题,现在刷题是必须的。
avatar
S*C
2
我没刷题时代码也是又臭又长又啰嗦, 刷了一段时间之后代码明显精简高效了很多。
avatar
p*n
3
agree
avatar
t*r
4
aglee
avatar
L*e
5
上几段你的精简有效的code大家来做下code review?或者上几段你认为的老工程师的
又臭又长又罗嗦的code的例子给大家做下反面教材?
如果做过几个十人以上的projects,或者是十万行以上coding量的projects,就会明白
,码工的首要priority是可读性,可扩展性,可维护性,而不是什么精简高效。。。

【在 S*******C 的大作中提到】
: 我没刷题时代码也是又臭又长又啰嗦, 刷了一段时间之后代码明显精简高效了很多。
avatar
S*C
6
多了,但公司不允许我贴出code
我只举个例子,一个int类型变量num有几十种可能的值, 就是1,2,...max中的一个
值,
max的值现在是40, 将来可能改成50或者100等。
现在的code是用一个switch(num)来判断的,效率极低,代码量很大,如果你刷过题就
不可能用线性查找来做

【在 L*****e 的大作中提到】
: 上几段你的精简有效的code大家来做下code review?或者上几段你认为的老工程师的
: 又臭又长又罗嗦的code的例子给大家做下反面教材?
: 如果做过几个十人以上的projects,或者是十万行以上coding量的projects,就会明白
: ,码工的首要priority是可读性,可扩展性,可维护性,而不是什么精简高效。。。

avatar
e*o
7
你有一点想法有问题,
max的值现在是40, 将来可能改成50或者100等
这个其实是毛病,将来怎么样,你怎么知道?根据我的经验,将来如何如何,假设很少
用的上。在这点钻牛角尖没意思。
case 太多,我一般是放到一个map里,不过switch 未尝不可。
你说说应该咋做?怎么提高效率?我没刷过题,还请指教。

【在 S*******C 的大作中提到】
: 多了,但公司不允许我贴出code
: 我只举个例子,一个int类型变量num有几十种可能的值, 就是1,2,...max中的一个
: 值,
: max的值现在是40, 将来可能改成50或者100等。
: 现在的code是用一个switch(num)来判断的,效率极低,代码量很大,如果你刷过题就
: 不可能用线性查找来做

avatar
S*C
8
这里要用Map,switch只适合判断的可能性不多的情况下, 像这种
几十种可能性的还用switch显然太罗嗦而且很低效, max的值我们一直在修改,系统一
直在开发,num可能性越来越多,所以max越来越大

【在 e*******o 的大作中提到】
: 你有一点想法有问题,
: max的值现在是40, 将来可能改成50或者100等
: 这个其实是毛病,将来怎么样,你怎么知道?根据我的经验,将来如何如何,假设很少
: 用的上。在这点钻牛角尖没意思。
: case 太多,我一般是放到一个map里,不过switch 未尝不可。
: 你说说应该咋做?怎么提高效率?我没刷过题,还请指教。

avatar
e*o
9
呵呵,很难说switch 效率就低,想想如果第一种情况覆盖99%的case的时候。
不过你说的这些跟刷题鸟关系?
这些哪些超出基本cs课堂内容?为何是必须刷题才能行?

【在 S*******C 的大作中提到】
: 这里要用Map,switch只适合判断的可能性不多的情况下, 像这种
: 几十种可能性的还用switch显然太罗嗦而且很低效, max的值我们一直在修改,系统一
: 直在开发,num可能性越来越多,所以max越来越大

avatar
S*C
10
switch是线性查找啊,时间复杂度是O(max),而用Map只要O(1)的时间, 更何况在有几
十种可能的时候switch代码极其啰嗦。
虽然brute force的解法很多情况下可以work,但面试的时候应该会把只会brute force
不知道优化解法的人刷掉,这就是目的。
当然我说的例子很简单, 很多人不需要刷题也知道。

【在 e*******o 的大作中提到】
: 呵呵,很难说switch 效率就低,想想如果第一种情况覆盖99%的case的时候。
: 不过你说的这些跟刷题鸟关系?
: 这些哪些超出基本cs课堂内容?为何是必须刷题才能行?

avatar
e*o
11
你没仔细看我评论,O(max) 不一定就比 O(1) 低效。另外,你create map的时间不算?
你要根据实际情况benchmark一下才知道。
我不觉得你刷题能学到的知识超过了计算机专业课堂所学。
事实上,你刷的算法,都是几十年前都研究好的,那个时候还没刷题这回事。
所以你说啥刷题必须,完全扯淡。

force

【在 S*******C 的大作中提到】
: switch是线性查找啊,时间复杂度是O(max),而用Map只要O(1)的时间, 更何况在有几
: 十种可能的时候switch代码极其啰嗦。
: 虽然brute force的解法很多情况下可以work,但面试的时候应该会把只会brute force
: 不知道优化解法的人刷掉,这就是目的。
: 当然我说的例子很简单, 很多人不需要刷题也知道。

avatar
S*C
12
map当然只create一次,然后反复利用。
我刷题不会创造新的算法,我只是实现现有的算法。面试本来就不会让你发明一个算法
出来。
你不刷可以,我几年前也是这样的,反正找大公司工作时就会知道了。

算?

【在 e*******o 的大作中提到】
: 你没仔细看我评论,O(max) 不一定就比 O(1) 低效。另外,你create map的时间不算?
: 你要根据实际情况benchmark一下才知道。
: 我不觉得你刷题能学到的知识超过了计算机专业课堂所学。
: 事实上,你刷的算法,都是几十年前都研究好的,那个时候还没刷题这回事。
: 所以你说啥刷题必须,完全扯淡。
:
: force

avatar
z*e
13
map也有很多种啊
不是所有的map都是hashmap那样amortised constant复杂度
比如treemap效率就比较低
switch的话,应该是写起来方便一点
而且这里几十种情况的话,建议你用上visitor
直接把这个switch去掉,还有古德霸说过那个反射的用法
也可以干掉switch
另外加上enum,有限数量的东西全部应该用enum
class是给无限数量用的
avatar
S*C
14
那我没说清楚, 我说的Map是这种,最常用的那种
Map map = new HashMap<>();

【在 z****e 的大作中提到】
: map也有很多种啊
: 不是所有的map都是hashmap那样amortised constant复杂度
: 比如treemap效率就比较低
: switch的话,应该是写起来方便一点
: 而且这里几十种情况的话,建议你用上visitor
: 直接把这个switch去掉,还有古德霸说过那个反射的用法
: 也可以干掉switch
: 另外加上enum,有限数量的东西全部应该用enum
: class是给无限数量用的

avatar
z*e
15

switch在几十个判断时候,跟hashmap的那种判断差别不大
就是几十次操作跟可能是一次操作的差异
jvm在我机器上,一秒可以执行大改2万次复杂的操作
比如new一个对象酱紫,所以几十次的节省在这里不会有太大的差异
如果是几万次,也许会有一两秒的差异
这里主要问题是这几十个statement看上去比较恶心
最好用上反射,通过enum直接获取class后执行
或者用visitor

【在 S*******C 的大作中提到】
: 多了,但公司不允许我贴出code
: 我只举个例子,一个int类型变量num有几十种可能的值, 就是1,2,...max中的一个
: 值,
: max的值现在是40, 将来可能改成50或者100等。
: 现在的code是用一个switch(num)来判断的,效率极低,代码量很大,如果你刷过题就
: 不可能用线性查找来做

avatar
z*e
16

还没用上gauva?
Maps.newHashMap();
这里用newEnumMap();会更好

【在 S*******C 的大作中提到】
: 那我没说清楚, 我说的Map是这种,最常用的那种
: Map map = new HashMap<>();

avatar
S*C
17
这里需要用几十个数值和相应对象一对一绑定, 用enum不合适,可能我一开始没说清楚

【在 z****e 的大作中提到】
: map也有很多种啊
: 不是所有的map都是hashmap那样amortised constant复杂度
: 比如treemap效率就比较低
: switch的话,应该是写起来方便一点
: 而且这里几十种情况的话,建议你用上visitor
: 直接把这个switch去掉,还有古德霸说过那个反射的用法
: 也可以干掉switch
: 另外加上enum,有限数量的东西全部应该用enum
: class是给无限数量用的

avatar
z*e
18

清楚
可以啊,直接在enum里面保留对象的reference
然后直接get出来就好了

【在 S*******C 的大作中提到】
: 这里需要用几十个数值和相应对象一对一绑定, 用enum不合适,可能我一开始没说清楚
avatar
S*C
19
如果这个Object只是一个String而不是user-defined class呢?
用这个相对于HashMap的好处是什么?

【在 z****e 的大作中提到】
:
: 清楚
: 可以啊,直接在enum里面保留对象的reference
: 然后直接get出来就好了

avatar
z*e
20

好处是便于扩展啊
比如你有n个类了
你想新增一个
用Class.forName("MyClassName"+i).newInstance();
比如你新增了一个
3
那么新建一个MyClassName3类,然后就可以开始写了
不需要修改原来代码,自己定义好interface就是了
连switch还有map都不用

【在 S*******C 的大作中提到】
: 如果这个Object只是一个String而不是user-defined class呢?
: 用这个相对于HashMap的好处是什么?

avatar
z*e
21
如果是visitor的话
自己定义一下visit方法
然后传入
MyClassName3{
Visitor visitor;
visitor.visit(){
}}
不过比较麻烦,算了,还是反射吧,那个简单多了
avatar
b*y
22
简单的事情为啥要复杂化??
Hash map 占内存,初始化麻烦,这也就是做应用吧?如果搞操作系统等对内存要求高
的事情,就不一定合适了。
刷不刷题和这个例子没关系。
avatar
S*9
23
记得当年看David Cutler的code,同样的代码在一个文件里copy了好几次,小年轻看到
了都忍不住手痒想refactor一下,换成inline也好啊。人家大爷牛就牛在知道有人会手
痒,专门写下comment让大家不要犯贱。compiler有很多优化不是刷题能刷到的。
switch compiler一般都是有优化的,这些map估计没有 ...

【在 e*******o 的大作中提到】
: 你有一点想法有问题,
: max的值现在是40, 将来可能改成50或者100等
: 这个其实是毛病,将来怎么样,你怎么知道?根据我的经验,将来如何如何,假设很少
: 用的上。在这点钻牛角尖没意思。
: case 太多,我一般是放到一个map里,不过switch 未尝不可。
: 你说说应该咋做?怎么提高效率?我没刷过题,还请指教。

avatar
L*e
24
是什么意思?每个switch的case里的statement是什么?给另外一个variable赋值?

【在 S*******C 的大作中提到】
: 如果这个Object只是一个String而不是user-defined class呢?
: 用这个相对于HashMap的好处是什么?

avatar
S*C
25
这个函数要不停的调用,所以应该做成static方法
其实不用HashMap也可以,用一个array of objects是最简单的
这个例子和刷不刷题关系不大,因为太简单

【在 b******y 的大作中提到】
: 简单的事情为啥要复杂化??
: Hash map 占内存,初始化麻烦,这也就是做应用吧?如果搞操作系统等对内存要求高
: 的事情,就不一定合适了。
: 刷不刷题和这个例子没关系。

avatar
S*C
26
compiler对Switch的优化就是做binary search, 不是所有compiler都会做到。
而且就算是binary search, 肯定没有用an array of objects简单明了高效。

【在 S*********9 的大作中提到】
: 记得当年看David Cutler的code,同样的代码在一个文件里copy了好几次,小年轻看到
: 了都忍不住手痒想refactor一下,换成inline也好啊。人家大爷牛就牛在知道有人会手
: 痒,专门写下comment让大家不要犯贱。compiler有很多优化不是刷题能刷到的。
: switch compiler一般都是有优化的,这些map估计没有 ...

avatar
p*y
27
同学, 这个Map有autoboxing problem你都不提出来讨论一下就断
定其比switch case快, 你觉得是你还是那些老年马工too simple, sometimes naive?
还有有个著名的design principle: don't optimize till you have to, 你不知道?

【在 S*******C 的大作中提到】
: 那我没说清楚, 我说的Map是这种,最常用的那种
: Map map = new HashMap<>();

avatar
L*e
28
这个主要看这些 objects是static的还是dynamic的,如果当初需求上没有dynamic的要
求,那么用switch木有啥问题。如果是后期添加了dynamic的要求,那么architect要做
决定是不是需要做refactoring。所以你这个例子既说明不了老码工的code又臭又长又
罗嗦,更说明不了刷题面试是必须的。。。打回去重新找个例子。。。

【在 S*******C 的大作中提到】
: compiler对Switch的优化就是做binary search, 不是所有compiler都会做到。
: 而且就算是binary search, 肯定没有用an array of objects简单明了高效。

avatar
p*y
29
这种情况下大牛都是用一个int map解决问题的, 注意不是Map.

【在 S*******C 的大作中提到】
: 这个函数要不停的调用,所以应该做成static方法
: 其实不用HashMap也可以,用一个array of objects是最简单的
: 这个例子和刷不刷题关系不大,因为太简单

avatar
S*C
30
我说了是用array of objects最简单明了高效
一开始说HashMap只是考虑max有可能变得很大而已
而且这种语言其实不是JAVA,他根本没有复杂的数据结构, 用array就是最好的选择

�7�2

【在 p*****y 的大作中提到】
: 这种情况下大牛都是用一个int map解决问题的, 注意不是Map.
avatar
g*g
31
这种如果你能传入一个Class,用反射,代码就要干净很多。数值总有个来源,那个
来源可以产生Class. 这样你就不用switch了。

清楚

【在 S*******C 的大作中提到】
: 这里需要用几十个数值和相应对象一对一绑定, 用enum不合适,可能我一开始没说清楚
avatar
S*C
32
如果这上百行的switch代码不是老码农写的,而是一个刚来几天的实习生写的你就不这
么说了

naive?

【在 p*****y 的大作中提到】
: 同学, 这个Map有autoboxing problem你都不提出来讨论一下就断
: 定其比switch case快, 你觉得是你还是那些老年马工too simple, sometimes naive?
: 还有有个著名的design principle: don't optimize till you have to, 你不知道?

avatar
S*C
33
写代码,尤其是第一遍的时候应该精益求精。这样以后维护性、可读性、扩展性好很多。
leetcode的官方solution为什么叫short and clean solution? leetcode上很多题都有
几十种写法,但精简高效的解法永远是最受欢迎的。
avatar
p*y
34
什么时候leetcode成了大工程coding srandard了? LOL。 敢情FLG的VP都是刷题刷来
的?

多。

【在 S*******C 的大作中提到】
: 写代码,尤其是第一遍的时候应该精益求精。这样以后维护性、可读性、扩展性好很多。
: leetcode的官方solution为什么叫short and clean solution? leetcode上很多题都有
: 几十种写法,但精简高效的解法永远是最受欢迎的。

avatar
c*f
35
工作写code最重要是可读, design pattern吧
感觉跟刷题是两回事
avatar
y*a
36
编译器处理SWITCH没你想的那么简单。可以做BINARY SEARCh, 但很多时候也可以做
JUMP TABLE,跟你那个MAP比也不会慢。
而且有时候BINARY SEARCh说不定比JUMPTABLE都要快,跟你的CASE的分布以及编译器的
代码生成有关系。

【在 S*******C 的大作中提到】
: compiler对Switch的优化就是做binary search, 不是所有compiler都会做到。
: 而且就算是binary search, 肯定没有用an array of objects简单明了高效。

avatar
g*g
37
几十个 enum挨个找都没多久,瓶颈从来不在这种地方。

【在 c******f 的大作中提到】
: 工作写code最重要是可读, design pattern吧
: 感觉跟刷题是两回事

avatar
p*2
38
大牛在哪个厂啊?

【在 S*******C 的大作中提到】
: 看了很多工作十几年的大公司老工程师的代码又臭又长又啰嗦,就知道刷题面试是必须
: 的。
: 当然他们赶上了好时候,他们进大公司的时候根本没有刷题,现在刷题是必须的。

avatar
n*s
39
培养简洁高效的写代码习惯是好的,但一般对系统的性能根本没影响。
代码的可读性和可维护性才是重要的。过于追求所谓时间空间复杂性指标,反而适得其
反。
avatar
j*o
40
还精益求精?基本上第一遍的时候都是保证能够work,维护性可读性啥的都是后来慢慢
考虑的。
现在的靠法速度,等你解决简单高效,公司早就倒了。

多。

【在 S*******C 的大作中提到】
: 写代码,尤其是第一遍的时候应该精益求精。这样以后维护性、可读性、扩展性好很多。
: leetcode的官方solution为什么叫short and clean solution? leetcode上很多题都有
: 几十种写法,但精简高效的解法永远是最受欢迎的。

avatar
h*e
41
我去,好像是你水平不怎么样吧。

【在 S*******C 的大作中提到】
: 多了,但公司不允许我贴出code
: 我只举个例子,一个int类型变量num有几十种可能的值, 就是1,2,...max中的一个
: 值,
: max的值现在是40, 将来可能改成50或者100等。
: 现在的code是用一个switch(num)来判断的,效率极低,代码量很大,如果你刷过题就
: 不可能用线性查找来做

avatar
e*a
42
different times, different levels.
avatar
g*0
43
太低估编译器和解释器了。switch一般都是O(1)。
avatar
A*o
44
code base上了million行,局部再清楚也没用;再厚黑一点,裁员的时候容易维护的先
裁掉,升级的时候别人搞不动的先升

【在 L*****e 的大作中提到】
: 上几段你的精简有效的code大家来做下code review?或者上几段你认为的老工程师的
: 又臭又长又罗嗦的code的例子给大家做下反面教材?
: 如果做过几个十人以上的projects,或者是十万行以上coding量的projects,就会明白
: ,码工的首要priority是可读性,可扩展性,可维护性,而不是什么精简高效。。。

avatar
z*e
45

这就是wishful thinking了
升级都搞不定的话,估计这个公司就离玩完不太远了
到时候市场整个淘汰掉这家公司
剩谁都没用

【在 A***o 的大作中提到】
: code base上了million行,局部再清楚也没用;再厚黑一点,裁员的时候容易维护的先
: 裁掉,升级的时候别人搞不动的先升

avatar
L*e
46
太天真了,三五人的小作坊靠这种厚黑术可能会有一点job security,大点的公司,做
大点的project,你三天都过不了code review,两个星期后先把这种放上PIP了。。。

【在 A***o 的大作中提到】
: code base上了million行,局部再清楚也没用;再厚黑一点,裁员的时候容易维护的先
: 裁掉,升级的时候别人搞不动的先升

avatar
s*r
47
人家烙印拼命往产品上面靠,增加自己的business value,先当project lead,然后是
manager,senior manager,director,一路上去
一群傻X老中,天天琢磨茴字的几种写法,在烙印下面写code
悲哀
avatar
s*r
48
三天过不了code review是正常的,改来改去的一周就没了

【在 L*****e 的大作中提到】
: 太天真了,三五人的小作坊靠这种厚黑术可能会有一点job security,大点的公司,做
: 大点的project,你三天都过不了code review,两个星期后先把这种放上PIP了。。。

avatar
s*r
49
刷题的coding和公司project是两回事
想code简洁清晰,多用FP,design pattern,还有DI,码code又快又好

多。

【在 S*******C 的大作中提到】
: 写代码,尤其是第一遍的时候应该精益求精。这样以后维护性、可读性、扩展性好很多。
: leetcode的官方solution为什么叫short and clean solution? leetcode上很多题都有
: 几十种写法,但精简高效的解法永远是最受欢迎的。

avatar
s*x
50
你的结论是对的,推理是错的。
刷题主要目的是应试,算法转代码。
合格的码工跟本就不应存在你说的那些问题。
avatar
l*n
51
要是刷提能取代正常的cs教育和工作经验,那真是太值了。干脆取消学校教育了,也不
用积累工作经验了
avatar
A*o
52
billion dollar business,手快的半年那段code就只有两三个人有资格做code review
了,其他的人过来review自找没趣。

【在 L*****e 的大作中提到】
: 太天真了,三五人的小作坊靠这种厚黑术可能会有一点job security,大点的公司,做
: 大点的project,你三天都过不了code review,两个星期后先把这种放上PIP了。。。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。