推荐:数据科学课程和书籍清单以及培训讲座


一亩三分地论坛

 找回密码
 获取更多干活,快来注册

一亩三分地官方iOS手机应用下载
查看: 862|回复: 7
收起左侧

我的一点面试经验[算法准备]

[复制链接] |试试Instant~ |关注本帖
blubell1211 发表于 2017-6-10 19:46:57 | 显示全部楼层 |阅读模式

2017(4-6月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 Onsite |Pass在职跳槽

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
之前误操作,把没有写完的文章发出去了(囧),重新发一次!. 1point3acres.com/bbs

大家好!今天我开始兑现之前的承诺,准备把我的一些面试准备经验分享给大家,回馈地里!废话不多说,直接上干货!. Waral 鍗氬鏈夋洿澶氭枃绔,

以下内容纯属个人经验,如有错误,请大家选择性过滤哈! ^_^

先前的文章中我也提到,由于白天需要上班,我是足足的准备整整一年半,每周只有每天晚上,以及周六周日这些时间可以准备,没有办法像很多在读的同学一样,有大把大把的准备时间。而且更严峻的问题是,我在刚刚开始准备初期,算法的基本功非常的弱!虽然在欧洲这个小国家做了5年的软件工程师,但是做的基本都是应用开发,很少用到复杂的算法。而我本人也并不是国内一流高校出来的算法大神,我可以说是“白手起家”开始准备的。
.鏈枃鍘熷垱鑷1point3acres璁哄潧
总结一下我在开始准备算法的时候的情况:
  • 没有时间,需要上班
  • 基础薄弱,白手起家


相信很多朋友们跟我的情况很相似,那么问题来了,在这种不利的情况下,如何准备?简单的说,我觉得有几点心得:
  • 放平心态,从头开始
  • 总结归类,举一反三
  • 做好计划,坚持到底


1. 放平心态,从头开始

就如之前所说,我在开始准备的时候,基本功非常不扎实,大学学过的那一点点算法,也基本上都还给老师了。仍然记得第一次刷LC的Easy级别的题,几道题愣是刷了两个小时!为什么呢?因为真的是太久没碰过这些基础知识了!这一堆一堆的题目,看的我眼花缭乱。怎么办?加油干!这是算法练习的第一个坎,而我这个时期的复习思路就是:
  • 首先自己思考问题,如果可以的话,至少写出最蠢的Brute Force的解
  • 随后开始看别人的思路,学习理解“透”别人的优秀解法
  • 最后把你觉得理解的最舒服的解法,用自己的方式再写一遍


这个时期实际上是算法复习中最最困难的时期,因为有太多的知识需要复习,有太多的解题技巧需要理解。但同时,这个时期也是提高最快的时期,所以建议大家刚开始的时候,一定不要“大跃进”,而是一点一点的吃透所有问题的思路。

我具体的复习方法是:
  • 我认真的把Leetcode里的Easy和Medium的题目都做了一遍
  • 我看了stanford的一门非常好的算法课程:Algorithms: Design and Analysis。这门课在coursera上可以找到,免费的课程。授课老师讲解的深入浅出,而且有很多非常细致的算法证明。不过我个人并不推荐大家太过关注算法证明的那些部分,因为非常的数学,不容易看懂。推荐大家好好的看这位老师的思维方式,对于理解“为什么我们需要算法”, “何时需要使用算法”这些问题有很大帮助。
  • 我认真的阅读了Cracking The Coding Interview这本书,这本书其实对于真正的算法练习,并没有在LeetCode,HackerRank上做题来的直接,但是这本书作为算法入门,以及面试技巧入门,确实很好的教材。
  • 九章算法是一个很好的网站,我听过几次他们的免费试听课程,讲的很棒,学到很多。九章上能直接搜索到很多常见算法的优秀解法,大部分也都是免费的,同时九章也有阶梯训练,很推荐大家去看看。
  • GeeksforGeeks这个网站我也经常会去看看,里面也有非常多的优秀解法,以及非常详细的解题思路。


基本上来说,在第一个阶段,我主要以“广刷题,多积累”为主。大量积累各种问题的解题技巧。希望大家在早期不要过于着急,一定要一步一个脚印的吃透每一个知识点,好好的补补课,把算法相关的基础知识砸扎实。

2. 总结归类,举一反三

在完成了第一阶段的基础知识的学习,刷了几百道各式各样的题目以后,我隐约的感觉到了自身水平的提高。 很多之前遇到过的问题,都能很快的给出bug free的最优解。 但问题也随之而来:
  • 即使刷了这么多题,有了一定的基础知识,我发现当遇到一些从来没有见过的问题,解决起来仍然有些吃力。
  • 曾经做过的题目,虽然一段时间里记忆会很深刻,但随着时间的流逝,曾经记住的算法也会慢慢淡忘。
. 1point 3acres 璁哄潧

这样我开始了第二次刷题,并且按照Array,String,Hash Table,Bit Manipulations,Tree,Dynamic Programming 等等,开始进行题目的归类,把属于同一个大类型的题目分别放到相同的文本当中,然后再一个类型一个类型的刷一遍。这次我发现了一些第一遍刷题没有注意到的规律,那就是其实很多同类型的题目,都有着很相似的解法思路。例如:
  • 当看到"give you an input array, output all combinations of input elements", 或者"find total amount of combinations of input elements",这种问题通常都是用Dynamic Programming,或者 Recursion + Memorization 的思路来解决。而且在使用Recursion时,通常用来递归的helper function都要用到一个“start”参数,来控制当前的递归是从input的“哪个位置开始的”。如果用到Memorization,还需要一个Hash Table作为cache。
  • 当看到input是"An array of integer numbers"的相关问题的时候,首先想到的应该是:是不是都是正数?有没有排序过?有没有重复的数?因为几乎所有的数组相关的问题,都存在这些"细节",而且很多时候,这些细节有可能成为发现解题思路的重要线索。比如说,"here we have an array with positive integers, find whether or not there is a subarray which sums to target T"。“positive integers”是一个关键词。这个关键词直接决定了你会考虑使用“Slide Window”写出O(N)效率的算法。如果这个问题把“positive”拿掉,解法就不一样了。如果有负数存在,就需要考虑是不是已经排序过的数组。如果排序过,仍然可以使用Slide Window;如果没有排序过,就需要使用Hash Table牺牲一定的存储空间来做到O(N)的效率。
  • Hash Table(Set)是个“神器”, 大量的问题都可以通过使用Hash Table(Set)来达到很好的时间复杂度。例如当你在设计你的算法的时候,你发现需要Cache一些之前已经计算过的结果,以备之后只用,减少无谓的计算,不用说,用hash table(set)。. more info on 1point3acres.com


通过归纳总结,我发现了相似题目之间的微妙联系,并且因为找到了规律,大大减小了我记住大量算法题目的记忆量,因为很多相似的题目,都可以做一一道题目进行记忆,形成了一定的记忆压缩,效果很好。

在这个阶段,我参考了一些Youtube上的视频,推荐大家也可以看一看,对于理解解题过程中常用的思路很有帮助:
. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷

3. 做好计划,坚持到底

刷完了第二轮算法,通过详细的归纳总结,我的算法解决能力有了本质的提升。即使遇到全新的题目,也可以很容易的找解题的方向,是时候开始冲刺了!
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
冲刺阶段,我开始刷所有F家出现过的真题,传送门在此。我给自己制定了详细的冲刺计划。每天都坚持利用晚上的时间,认认真真拿起纸笔,在纸上写上5-7题。事后当我刷完几乎所有的真题,我深深的感觉到了手写题目的精妙之处。比起在键盘上敲5遍代码,手写1,2遍题目的记忆效果要更加好。通过手写题目,不但可以通过身体来加强记忆,提高熟练度,更重要的是,这是针对Whiteboard Coding很好的练习。

关于Whiteboard Coding的练习,我的经验就是:一定要在面试之前,专门用1-2天,找个真正的Whiteboard,和几道地里的面试真题,拿起水笔,写上一写。主要的原因是,在白板上书写代码的感觉,跟用纸笔书写代码是不一样的。如果没有实际去练习过,在真正的白板上书写就很不流畅,自信心也会下降。所以推荐大家,一定要找个白板,或者镜子进行专门训练,才能做到“下笔如有神”。
. Waral 鍗氬鏈夋洿澶氭枃绔,
IMG_3967.JPG.jpeg


最后要跟大家分享的,就是保持坚持到底的决心。刷题是很枯燥的,而且越往后面,越接近面试之前,得失心越强,刷题的压力越大,精神越接近极限。为了应对这种精神上的压力,希望大家调整心态,激励自己,“为了梦想,不要放弃,坚持到底,就是胜利”。在此分享给大家一段我很喜欢的歌曲的歌词,名叫“Get Over”,来自日本经典动画“棋魂”。每当听到这些歌词,都会重新唤回我的决心:


即使平时如何嬉戏,也会茫然若失。. visit 1point3acres.com for more.
被冷漠的目光包围,又被时代之风吹袭。
倘若可以完全放弃,最初就不应开始努力。
如果可以完全忘记,那就不会如此在意。
即使忐忑不安与勇往直前在内心翻腾,仍要用自己的双手努力实现梦想。
虽然会受伤垂泪,但我们将会跨越重重障碍,比他人攀的更高。


. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
下集预告:我的一点面试经验[Onsite面试],敬请期待!

评分

6

查看全部评分

vitac215 发表于 2017-6-30 22:01:23 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
楼主写的很实诚啊,感谢分享~
回复 支持 反对

使用道具 举报

顽皮的柚子 发表于 2017-6-30 22:18:39 | 显示全部楼层
关注一亩三分地微博:
Warald
感谢lz分享。感觉很实用。
回复 支持 反对

使用道具 举报

iell 发表于 2017-7-1 02:36:25 | 显示全部楼层
谢谢楼主,很实用!
回复 支持 反对

使用道具 举报

flyoasis 发表于 2017-7-1 02:46:35 | 显示全部楼层
谢谢LZ, 写的很好。。。
回复 支持 反对

使用道具 举报

xdsb1989 发表于 2017-7-1 02:53:09 | 显示全部楼层
总结了一些非常好的心路历程,非常感谢楼主的分享。
回复 支持 反对

使用道具 举报

涉入如有 发表于 2017-7-1 07:56:12 | 显示全部楼层
好崇拜你啊。。
回复 支持 反对

使用道具 举报

Jimmie 发表于 2017-7-1 09:06:57 | 显示全部楼层
LZ太厉害了 希望自己也能有你的毅力
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-7-28 19:20

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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