专栏 | 九章算法python
网址 | www.jiuzhang.comc++
做者:CMN 九章学员,上过《Python算法入门基础班》《算法面试高频班》git
签约offer: Bloomberg News程序员
拿到offer: Bloomberg News面试
求职经历算法
个人背景是美硕,商学院 IT, 而后是在硕士在读转了 IT 专业。由于课程都很偏商,因此只有几门简单的编程或数据库的课程,彻底没有涉及算法的课程。我毕业后加入了最后一个学期时实习的公司,职位是 Database engineer。sql
作了大概一年后,机缘巧合在一个雪友的介绍下开始知道有算法这么个东西,想要转行找好的码农工,须要过这一关。因而下决心开始准备。数据库
我是今年2月开始投简历的,花了500大元找人改了简历和linkedIn page(主要是我本身写简历水平太差再加上实在没时间改)。编程
1.收到了2个小公司的面试邀请api
第一家公司基本没有算法题,见了全部人,而后最后让回家写个restful challenge, 这个我没写好,被拒了。第二家,面了两道题,valid parenthesis 还有 number of island很简单,相信你们均可以秒掉。最后的onsite是系统设计, 设计一个调查问卷。ood, 设计一个电梯。感受小公司仍是很看重你的经验的,若是你会他们要的,就留,不会就滚。
2.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 一类的工做。
3.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。
课程帮助
1.上课篇
开始的时候一头雾水,整个过程就像一个深度优先搜索,先从 MIT 的公开算法导论课开始,发现第一节课后开始已经晕逼,而后各类网上资源,都无功而返。大概是从将近两年前据说了九章的课程,而后才终于进入了正轨。
上了一遍算法和强化以后,忽然工做开始变忙,因而暂停了半年刷题而且把以前原本就半桶水的技能所有忘光。因此毅然决定再上一遍,而后忽然感受第二遍时慢慢找到了些感受。我一点我的的建议特别是对在职的同窗,必定要把上课和作题连起来,这样的话由于不用不停的回忆以前讲的内容,因此实际上是省时间的,若是断了就再上一遍,由于即便是第二遍,也会有不少新的收获,我我的在第二遍课时就经历了几个顿悟的过程。还有一个经验就是高频题班在开始面试前的效果很好,尤为是对于像我同样数学和计算机基础比较薄弱的同窗,能够保证若是遇到这类偏题(好比稀疏矩阵乘法,大数乘加,模拟),不会无从下手。若是连基本的语言都还不会的话,能够考虑上《九章算法基础班(python)》,先学好python,再开始刷题。
2.刷题篇
在最开始的时候,这是最打击的部分。算法题的两大法宝,拿到题选什么算法和如何实现这个算法,这两个都不行。但我我的感受,后者比较容易,因此能够先从实现算法开始练起(lintcode的分类阶梯训练),而后当和一些标准算法数据结构都不陌生后,再去见新题,看哪一个算法能够解决,后面这一步也是我花时间最久的一步,也是我以为我从九章课上收获最大的,由于训练的是思惟模式,好比看到topk, 就能够联想到heap,看到找所有解就要想到如何搜索,看到简单图或棋盘,就要想到bfs。
还有一个我以为帮助我很大的是分类和记录本身的作题记录,好比gitbook,或一些博客网站均可以。常常一个题作了俩礼拜之后好像历来没见过,或者说记得第一和第三步,可是忘了第二步,这时候能够回去翻一下本身从前的思路,能够发现是再哪个思惟步骤断层了,重点记这个。我的经验是写的越细越好,否则事后根本看不明白。
我天天能够用来刷题的时间不多,只有回家后大概从8点开始刷,一天的工做后状态也很是差,因此我就把节奏放慢,少刷几道而后反复根据思路刷,我喜欢一边叨叨一边写,这样能够督促本身确实明白了解题的每一步,并且也就当练练面试时的场景。这样坚持了大概7到8个月,虽然只刷了大概350左右,但基本能够保证60% bug free而且能够解释思路。这一步我想根据你们可支配时间来决定,还有就是连续坚持,不要断断续续。
3.准备建议
1.关于Bloomberg
两连败了之后,这是我剩的最后两个面试了。由于我同时申请了两个职位,两个都发了面试邀请因此就一块儿进行了。挺hr说彭博愈来愈不要求 c++了,因此像我这样从没碰过 c++的同窗均可以去试试。
2.第一个电面
上来先问简历,而后基本数据结构实现,例如,如何减小 hash map 中的hash collision, b tree 是否是 binary tree, linked list/array/ hashmap/hashtable 啥时候该用啥这类的问题。这个必定不能不会,尤为面彭博,若是不会说明你还没准备好,能够再拖一拖。算法题是在二维矩阵中从左上向右下的路径总数,动归就行了,也能够搜索。要讲清思路再开始作题。
3.第二个电面
没有简历直接作题,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, 能够参考这个文章:
www.cs.princeton.edu/courses/arc…
顺利拿到两个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 最大收益,有点懵,最后讨论想法思路,给了不少提示。而后系统设计,不说具体,但基本意思是,如何处理数据传输前获取服务器状态用时过长的问题。
终于在以后一天同时拿到了两个组的Offer,历时两年的学习准备终于能够告一段落了,比预期的收入大概多了40%,并且新的base是我目前薪水加奖金的2.5倍,收到通知的一刻比当年高考录取还要爽。终于能够松一口气了。最后有几个鸡汤想跟你们分享一下。
1. 参加 lintcode 每周的算法比赛,享受从3000名飞跃到500名的快乐,这个给了我很大的动力。并且也能见识不一样的题。
2. 若是时间有限,就要规划出时间只留给学算法,个人特定时间是工做日天天8点之后直到睡觉。周末上下课,想刷就刷,不想刷就玩一下。
3. 多上qq群交流,安利身边的人也来学算法,而后借机站在过来人的角度给他或她讲题,增长本身的成就感也巩固学的知识最重要的是有人一同做战。
4. 用本身的工做或学校project增长本身的软技巧,与人沟通的能力,而且把本身的想法解释给别人听的能力。也能够本身对着白板bb,有用就是会有点无聊。
5. 尽可能利用身边全部能用的资源,朋友内推,九章官网长期内推贴等,而且能多作几回Mock就作几回。
6. 最后就是想说,若是我这样的算法小白加脑子不灵光还没时间的人均可以,全部人只要有足够的恒心和正确的方法,都必定能够拿到本身想要的offer。