注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
【前言】
前段时间看到个面试刷题相关的帖子,心血来潮在帖子下面写了个回复结果意外的挣了不少大米。结果后来发现帖子被删了(好像是因为楼主在卖课?)
好在我想办法找到了之前写的文章,稍作改动重新分享一下吧,希望能给我的小马甲也挣点儿大米。
这篇文章并不是典型的面经,我这个角度可能比较新奇,甚至有的人可能觉得没什么用,所以请各位看官理解性的接受。
本文仅代表个人观点,如果对您有帮助我会很开心,如果你觉得我在胡说八道也请嘴下留情不要骂太狠,就当看个笑话了。
首先声明我是个话痨,不喜欢长文的,时间宝贵的,现在就该撤了。。。
【自我介绍】
我是做啥的?
现在我是某大中型厂在职底层manager,现在级别对标各大厂的L6/T6/E6。不要问我是哪个厂的,要是真想告诉你我就用大号不用马甲了。
我的代码能力?
不好意思,我真的是渣!刚打开了一下我的LC,我发现我至今为止一共做过39题,16个Easy,23个Medium。我也不是凡尔赛算法代码大牛(前段时间地里看到个IOI的选手,吓坏了)。我之前在国内参加竞赛就是NOIP一日游,后来出国参加ACM ICPC也就是去regional露个脸。参加工作后,平均每年也就只能产出10k-20k行代码,大部分估计都是在写config,不脸红的说,参加工作真没写过什么像样的算法,就是CRUD大法!后来当manager了更是不写代码好多年。。。
我的面试经验?
这些年我作为面试官倒是参与过多次招聘和面试,但是这辈子我被别人面试的次数一只手就能数过来。最近5年一共就参加了一次面试,就是最近这次跳槽的面试。虽然我刷题很少,面试经验也很匮乏,不过通过我的面试技巧仍然通过临场发挥通过了面试拿到了offer(此处好像有明显的炫耀痕迹。。。)
【这篇文章适合谁读?】
读到这里你可能会觉得我就是个渣渣,根本不配来分享面试经验。5年一共参与了一次面试,LC一共刷过39题,你可能都怀疑我有些算法根本都不懂。
实话实说,我觉得你说的可能一点儿都没错。你真让我解释Dijkstra我可能还得先Google一下,你让我拿到题就手撕DP马上能找到状态转移方程我也可以很负责任的说我做不到。如果你觉得这是浪费时间,现在就应该停止阅读。。。
但是如果你对常用算法(比如简单的排序,深搜广搜,贪心,等等)和数据结构(数组,链表,二叉树,等等)有基本的理解,但是并不是面试精英,想要提高一下面试成功率,但是又和我一样懒得刷题,这篇文章“可能”会适合你。
【这篇文章不适合谁?】
如果你对我的背景并不认可,或者我们价值观不符,我觉得还是别读了,免得读完你骂我。
如果你是算法大牛(比如竞赛精英),你不需要读,你直接闭着眼把最优解写得无懈可击,然后和面试官说,太简单了,再来两道难的。
如果你把LC都刷透了,你可能不想读这篇文章。只要你不是机械性的背题,有这种毅力的人我相信肯定能成功,毕竟熟能生巧。
如果你想提高某种特定的技巧(比如DP),我这里帮不了你。
如果你现在还缺乏基本的技能,比如现在还不能把loop和recursion之间互相转换,这篇文章也不适合你,先好好打基础吧
【序】
如果你已经看到这里了,那么看来你的确挺闲的,竟然有空看我一个刷题渣给你讲面试技巧!
首先,不可否认通过刷题甚至背答案帮助了很多人上岸转码等等,但是个人不赞成盲目刷题,尤其是不赞成背答案。我觉得,只要你要把理论学明白,刷题就是增加个熟练度而已。常用的算法和数据结构,尤其是在面试会考到的,其实并不多。如果还没搞懂理论就盲目刷题背题,那么面试就是在赌你刷的题到底会不会考。其次,这种刷题,我觉得是一种事倍功半的做法,并不是效率最高的。
再其次,面试的目的是对你进行一次尽可能全方位的评估,就好比系统设计面试并不是单纯的考法,考察最优解,代码风格,等等。但是25分钟过后,我们讨论了5种不同的解法,讨论了各种优劣取舍,同时实现了其中一种(不写代码没法展示代码水平),写代码的时候没有明显的卡顿,各种syntax也比较熟练,面试官得到了他想要考察的所有的信号。
那么总结一下的话,不管面试官是谁,你都可以试探性的去寻找他实际的考点,拿到题然后就埋头写并不一定是最好的方法。
面试官需要从你身上得到一些关键的信号,与此同时你也可以尝试去从面试官身上得到更多有利的信息(这个和要hint不一样)。
比如这次面试,如果我确认需求之后直接写解法1,应该也能很快写出来。
但是写完后面试官肯定还会让我写其他解法,因为解法1并不是最优解也不是他想要考察的考点。
然后我会再写第二种解法,如果没选好路线(比如选了2.1),可能还要写第三种(比如把2.1改成2.3或者解3)。
尤其如果面试官经验有限无法及时的引导候选人回到正轨(这次面试如果我直接写解法1,面试官应该及时制止我。。。),及时候选人真的能想出来正确的答案但是没有机会展示出来。
因为如果要写好几种解法的话很可能候选人时间会不够用,甚至由于需要写多种解法从而更容易犯错(和言多必失道理相同)。
同时,如果需要快速写代码,候选人会有精神压力,紧张可能会导致思路混乱,也会容易犯错(我真的着急的时候有时大于和小于都能写反)
这里的技巧就是通过交流来减少走弯路的概率,我这次面试只用了一半的时间(大约20 分钟,远远低于原计划45分钟),但是讨论了5种解法,实现了一种解法,还通过了面试
如果你感兴趣的话,这里是我这次面试讨论的所有解法
[解1] 存起来排序
面试官明确表示不想看这种
[解2.1] 合并前两个,再合并第三个,第四个。。。
[解2.2] 所有链表放在一起合并
对解法2.1的优化,两两链表头节点比较变成同时比较所有k个链表的头节点
[解2.3] 所有链表放在一起合并,用优先队列(我最终实现的解法)
对解法2.2的优化,利用优先队列把每次k个链表比较的时间从O(k)变成O(log k)
[解3] 两两合并
对解法2.1的优化,divivde and conquer,两两合并然后继续两两合并,一直到合并成一个为止,把总合并次数从k降低为log(k)
其实还有其他的解法,不过如果你都读到这里了,你应该会明白这个道理,你到底会几种解法并不重要,首要的是搞清楚到底面试官想要看到什么。
作为候选人,你参与面试的目的应该是如何用最少的时间最全方位的展示自我如何临场发挥,如何一边整理思路,一边从面试官取得有利的信息。
不喜轻喷。。。
你可当我通过面试完全是因为走了狗屎,运气好,怎么想都行。
如果要是哪里有错别字也请理解性的谅解一下,谢谢。。。 |