当前位置 博文首页 > 九章算法的博客:商学院转CS,零算法基础,摆脱题海战术拿到 off

    九章算法的博客:商学院转CS,零算法基础,摆脱题海战术拿到 off

    作者:[db:作者] 时间:2021-08-04 11:55

    0基础转行拿到Bloomberg 两个组的Offer,比预期的收入大概多了40%,而且新的base是我目前薪水加奖金的2.5倍,收到通知的一刻比当年高考录取还要爽。因此也想把我的方法分享给大家,给还在苦苦挣扎的同志们一些启发,也希望能避开一些坑。

    我的求职经历

    先自我介绍下,我的背景是美硕,商学院IT, 然后是在硕士在读转了IT 专业。因为课程都很偏商,所以只有几门简单的编程或数据库的课程,完全没有涉及算法的课程。我毕业后加入了最后一个学期时实习的公司,职位是Database engineer.

    做了大概一年后,机缘巧合在一个雪友的介绍下开始知道有算法这么个东西,想要转行找好的码农工,需要过这一关。于是下决心开始准备。

    我是今年2月开始投简历的,花了500大元找人改了简历和linkedIn page(主要是我自己写简历水平太差再加上实在没时间改).

    收到了2个小公司的面试邀请

    第一家公司基本没有算法题,见了所有人,然后最后让回家写个restful challenge, 这个我没写好,被拒了。第二家,面了两道题,valid parenthesis 还有 number of island很简单,相信大家都可以秒掉。最后的onsite是系统设计, 设计一个调查问卷。ood, 设计一个电梯。感觉小公司还是很看重你的经验的,如果你会他们要的,就留,不会就滚。

    Facebook的data engineer 电面

    这个是hr 在linkedin上联系我得到的,虽然感觉和自己想要转行的前提有点不符(我想做software engineer)但是毕竟是facebook, 还是要试一下的。感觉他们要考的东西都是我天天做的,肯定得心应手,没想到电面就挂了,电面考的是30min sql, 30mins 编程(lintcode na?ve级别)。如果有同学想申请这个职位,在做coding时千万不要overthinking, 我在面试的时候就试图implement split()这个function, 面试官直接说不知道你在干什么,能不能从上面的函数列表里直接挑一个做这步,然后看到split function赫然在目。然后因为类似的情况浪费了很多时间,再加上无比的紧张最终挂掉。对我打击超大,觉得自己老本行都搞不定,更别提转行了。但还是毅然选择了坚持找,所以大家也一样不要灰心。这个职位考的是对数据集,表及关系的理解,把buisness case apply to table and relationship这一类。工作中也是主要做sql, 和设计一些data pipeline 一类的工作。

    Amazon的SDE 纽约组

    海投亚麻, 然后居然在3个月后收到hr回音,做OA. 把OA面经大全翻了个遍。然后都做了,但是还是由于过度紧张,第一题完全看错了题,find all substring with length k and have k distinct character. 其实就是找所有k长度的没字符重复的词嘛,没难度,偏偏没看到那个length k, 这样浪费了30分钟,全部重写,导致第二题来不及。大家在做时一定要仔细看题。第二题,是说给一个 tag list = [“I”, “love”,”jiuzhang”], 然后一个字符串数组 [“I”, “you”,”her”,”love”, “I”, “JiuZhang”], 让返回一个最小的含有tag list所有词的区间顺序无所谓。这题就是[3,5], 俩指针就好了,但是实在时间来不及。OA时还有个地方我觉得要注意就是如果时间不够,一定要让程序可以compile, 不然都不会送到review。

    关于上课

    其实这个阶段我比较沮丧,只剩下Bloomberg的两个组不同的面试。于是我打算上些课程。 开始的时候一头雾水,整个过程就像一个深度优先搜索,先从MIT的公开算法导论课开始,发现第一节课后开始已经晕逼,然后各种网上资源,都无功而返。

    大概是从将近两年前听说了九章的课程,一开始也拿不定主意要不要报,毕竟$199也是钱嘛,于是就先在他们官网听了一个免费的讲座,是一个叫九歌的人,分享他从社科转码的学习以及面试拿0ffer的经历,刚好他是拿到Bloomberg的offer,同样是0基础,我发现他的方法对我来说很适用,g按照他的方法我才终于进入了正轨。顺便说一句,他这几天又有九章讲座了,反正是免费的,有兴趣的可以去听听看,个人觉得还是会很有收获的,听课链接:jiuzhang.com/seminar/12。(@九歌,够意思了把)


    然后我就报名九章的课程了,上了一遍算法和强化之后,突然工作开始变忙,于是暂停了半年刷题并且把之前本来就半桶水的技能全部忘光。所以毅然决定再上一遍,然后突然感觉第二遍时慢慢找到了些感觉。我一点个人的建议特别是对在职的同学,一定要把上课和做题连起来,这样的话因为不用不停的回忆之前讲的内容,所以其实是省时间的,如果断了就再上一遍,因为即使是第二遍,也会有很多新的收获,我个人在第二遍课时就经历了几个顿悟的过程。还有一个经验就是高频题班在开始面试前的效果很好,尤其是对于像我一样数学和计算机基础比较薄弱的同学,可以保证如果遇到这类偏题(比如稀疏矩阵乘法,大数乘加,模拟),不会无从下手。


    关于刷题

    在最开始的时候,这是最打击我的部分。算法题的两大法宝,拿到题选什么算法和如何实现这个算法,这两个都不行。但我个人感觉,后者比较容易,所以可以先从实现算法开始练起(建议lintcode的分类阶梯训练),然后当和一些标准算法数据结构都不陌生后,再去见新题,看哪个算法可以解决,后面这一步也是我花时间最久的一步,也是我觉得我从九章课上收获最大的,因为训练的是思维模式,比如看到topk, 就可以联想到heap,看到找全部解就要想到如何搜索,看到简单图或棋盘,就要想到bfs

    还有一个我觉得帮助我很大的是分类和记录自己的做题记录,比如gitbook,或一些博客网站都可以。经常一个题做了俩礼拜以后好像从来没见过,或者说记得第一和第三步,但是忘了第二步,这时候可以回去翻一下自己从前的思路,可以发现是再哪一个思维步骤断层了,重点记这个。个人经验是写的越细越好,不然过后根本看不明白。

    我每天可以用来刷题的时间很少,只有回家后大概从8点开始刷,一天的工作后状态也非常差,所以我就把节奏放慢,少刷几道然后反复根据思路刷,我喜欢一边叨叨一边写,这样可以督促自己确实明白了解题的每一步,而且也就当练练面试时的场景。这样坚持了大概7到8个月,虽然只刷了大概350左右,但基本可以保证60% bug free并且可以解释思路。这一步我想根据大家可支配时间来决定,还有就是连续坚持,不要断断续续。

    见证奇迹的时刻

    关于Bloomberg

    前面说了, 两连败了以后,这是我剩的最后两个面试了。因为我同时申请了两个职位,两个都发了面试邀请所以就一起进行了。听hr说彭博越来越不要求c++了,所以像我这样从没碰过c++的同学都可以去试试。

    第一个电面,

    上来先问简历,然后基本数据结构实现,例如,如何减少hash map 中的hash collision, b tree是不是binary tree, linked list/array/ hashmap/hashtable 啥时候该用啥这类的问题。这个一定不能不会,尤其面彭博,如果不会说明你还没准备好,可以再拖一拖。算法题是在二维矩阵中从左上向右下的路径总数,动归就好了,也可以搜索。要讲清思路再开始做题。

    第二个电面

    没有简历直接做题,Process log, [[1,5],[1,6],[5,7],[9-11]] 代表各个process的起点和终点,返回所有没有job running的区间。和number of airplane in the sky 略微不同大体思路是一样的。在返回上。Follow up是让返回最少process running的区间,先找到最小的数,然后返回区间是那个数就好了。最后要merge重叠,也是Lintcode原题。第二题有点难度,给一个list of new hires 和一个list of hiring entity, 然后每一个人对每一个用人单位都有一个喜好度排序,每一个用人单位也对每一个new hires有一个喜好度排序,问如何找出一个稳定的match, 可以参考这个

    cs.princeton.edu/course

    顺利拿到两个onsite安排在了同一天。

    1.1. 两个engineer, two sum 变种,找到两个最先(index最小)的相加起来等于k的一对数,follow up what if 是m个相加起来等于K的数?

    1.2. 两个超级senior的engineer, 第一个问题出奇的简单,问如果从一个matrix的一点出发,如果计算所有neighbor的和,然后follow up是如果加一个Input是找距离该点为k的行和列的和

    然后后面是这样,给一个stock data stream, input 是stock名字和交易量, 设计一个系统实时返回top k 交易量,各种情况分析,实现原理,复杂度分析。大家这里划重点啊,令狐老师海量数据处理原汁原味的原题,在线词频统计,这个一定要看。

    1.3. 就在我觉得一切已经结束的时候,又款款的走进两位工程师,然后开始word stream, 不需要实时,返回alphbetical order和词频统计。 用到hashmap,然后比较各种sort, 如果Input是linked list咋做? hashmap怎么实现的,各种计算机基础知识,一道看似简单的题大约聊了30分钟,写码大概只用了5分钟。刚要松一口气, 设计电梯类,要求处理request和电梯停动的算法。

    1.4. 老板出现然后带我去吃了个Lunch (非常好吃的希腊餐馆,推荐大家,在大厦对面)顺便了解我找工作的动机,想要发展的方向。上午终于结束

    2.1 下午依旧做题,stream words classification, 给一个api告诉你两个Object是否是同一类的,如果处理去重和不去重两种情况。然后后面一题,给time slots of meeting room booking [[1130,1200], [1130, 1230], [1230,1400]]问最少需要多少个meeting room, lintcode 原题,number of airplain in the sky. 排序扫描线。

    2.2 继续,买卖股票一次交易最大收益,然后follow up unlimited number of trade 最大收益,有点懵,最后讨论想法思路,给了很多提示。然后系统设计,不说具体,但基本意思是,如何处理数据传输前获取服务器状态用时过长的问题。

    最后的两轮是manager(没有technical,可能因为体谅我已经面了一整天了)和hr。就是纯聊天了

    终于在之后一天同时拿到了两个组的Offer,历时两年的学习准备终于可以告一段落了,最后有几个鸡汤想跟大家分享一下。

    • 1.参加lintcode每周的算法比赛,享受从3000名飞跃到500名的快乐,这个给了我很大的动力。而且也能见识不同的题。
    • 2.如果时间有限,就要规划出时间只留给学算法,我的特定时间是工作日每天8点以后直到睡觉。周末上下课,想刷就刷,不想刷就玩一下。
    • 3.多上qq群交流,安利身边的人也来学算法,然后借机站在过来人的角度给他或她讲题,增加自己的成就感也巩固学的知识最重要的是有人一同作战。
    • 4.用自己的工作或学校project增加自己的软技巧,与人沟通的能力,并且把自己的想法解释给别人听的能力。也可以自己对着白板bb,有用就是会有点无聊。
    • 5.尽量利用身边所有能用的资源,朋友内推,九章官网长期内推贴等,并且能多做几次Mock就做几次。
    • 6.最后就是想说,如果我这样的算法小白加脑子不灵光还没时间的人都可以,所有人只要有足够的恒心和正确的方法,都一定可以拿到自己想要的offer.

    cs