• Stars
    star
    170
  • Rank 223,357 (Top 5 %)
  • Language
  • Created almost 6 years ago
  • Updated almost 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

CS Interview preparation for non-CS students

InterviewPreparation

CS Interview preparation for non-CS students

新手零基础刷leetcode与编程面试准备

文章适用范围

关于刷题:

本文章是给时间不够(准备时间在2个月以内),基础薄弱(非CS本科)的人。请时间充裕,或CS科班出身的无视。

关于面试:

我只讲没在论坛/书上看人说过的一些小技巧

刷题前期准备

看完一些能用动画/视频图解算法的书/app/视频。对每种数据结构/算法,能清楚地运作一次。(比如随意一组数知道怎么样手动heap sort / priority sort一次 )

搜索的时候关键词 algorithms + illustrated / tutorial / visualisation

刷题

看视频

一上来不是去刷题,而是先看看一些youtube的视频/论坛。找那种,会告诉你正统做法怎么做的,解题步骤,思路是什么。

看看别人怎样从暴力解,到OK解,再到最优解,并且完成 follow up。

千万不要看那种,一上来,就说【这题很简单我们直接写代码】的。

搜索的时候直接youtube / 谷歌 那道题的题号 + 题目。

选题

很多人一上来就先一直做easy的题。个人推荐做最frequent的题。按照freq排序做头200题足够了。做到后面见一题会一题。

一开始不建议按tag刷题,因为看着tag是two pointers、hash map 你心里就知道这题该用什么思路了。一开始就按照freq的排序混着做,自己去想思路。心里多总结。

其他人的回答

每道题就算做出来了,也一定要看看讨论区的其他高分回到,一来我们还菜的时候想到的不一定是最优解,二则每一题多一些思路以后更加灵活。有时候follow up就是【这题你还有啥其他解法】。

题目里有【one-line solution】字样的新手可以不用点开了。

按tag精做

等到比较熟练了,(easy基本会,medium三成会)就开始按tag分类别做题,leetcode题目自带tag。

可以看着经典书籍cracking the coding interview做,不要被厚度吓到了,后大半本是题目的答案,前大半本有一定程度废话,千万不要被厚度吓到了。建议边看边刷。比如看完书上和hash table有关的,就去把hash table的题做了。

另外,这本书的作者,在youtube上是有视频的,有每个章节的内容的讲解。如果有需要,在github上有官方的,不同编程语言的版本cracking the coding interview。

按公司刷题

面具体公司的时候,去刷那个公司最freq的30题,中奖率是有的。这时候刷就不用真的去写了,看题然后看看自己心里有没有思路就行了。在leetcode/lintcode题库里就可以选具体公司。leetcode的explore还整理得蛮好的,它会具体到这题是谷歌的onsite还是phone还是campus。

心态上更多是看这个公司的出题喜好,而不是真的一定只要原题。

做题习惯

做题时养成笔头逻辑推理之后,再书写代码的习惯。一开始不要上来就写。

另外,平时养成开记事本写代码的习惯,不要依赖notebook/IDE。倒不是指不要依赖tab补全之类的,主要是不要依赖他们的纠错/报错。要做到记事本写代码一跑就bug free.

格式

不是科班出身的人经常不知道格式。

命名

函数、变量的命名规则要统一且规范。

另外,别人就算不看注释也能无障碍看懂代码。另外一定要写清楚这个函数/变量是什么。比如说,loop一个list的坐标点 ,新手就容易 for item in list_a ...,别人完全不知道item是啥,一定要 for point in point_list ... 诸如此类的别人看得懂的命名方式。

另外新手命名map/dic也容易瞎命名。某个dic,从A map 到B,这个dic 就可以命名为A_to_B, 诸如此类。

注释 + 查input

写注释: 函数开头要写注释,把type和变量是啥写清楚

    def two_sum(self, nums, target):
        """
        :type nums: List[int] - a list of numbers that ...
        :type target: int - the target number
        :rtype: List[int] - a list of two numbers that ...
        """

查input:查input是否合法等,然后报错/扔异常,问问面试官要求

面试的时候,十有八九,写一次面试官就意会你懂了,就会说“我知道你懂了,后面的函数可以不写了注释 + check input了。”

白板排版 划重点

面试时,拿到白板/白纸就画条竖线。 把功能明确的代码写成函数,尤其是会被复用的,左侧写非常简洁明了的主函数,右侧写def 要用到的其他函数。 比如一上来,左侧先写:

def find_route(map):
	find_neighours(...)
	...
	check_exit(...)
	...

整个左侧简洁明了,思路清晰,面试官一看就知道我要干嘛——

我想找路径
	找这个点的邻居哪个是路
	...
	查点是不是出口
	...

然后,右侧一上来先写:

def find_neighours(...):
	就这样空着
def check_exit(...):
	就这样空着

并不急于去写里面的东西。 等和面试官确认左侧展现的思路他/她认可了,再去补右侧的函数。

千万不要所有东西都堆在主函数里,看起来就是 ——

我想找路径
	看看这个点的上面
	看看这个点的左面
	看看这个点的右面
	看看这个点的下面
	...
	看看这个点的坐标
	这个坐标是不是地图边界
	...

让人看着很乱,面试官理解就要很久。

良好的排版,可以防止

  • 某个地方卡壳到最后都没说清楚整题思路
  • 代码太多太杂影响面试官看思路
  • 思路本来就错的,没提前沟通,写到后面没时间改。

99%的情况下,面试官不会让你真的把右边每个函数都写出来。他/她一般挑1-3个最重要的让我们写。无形中防止了,时间不够写不完代码。

画图讲思路

有时候题目非常复杂/非常绕,觉得讲不清楚就画图阐述思路。

真的不会

千万不要沉默,聊题,聊思路,面试官一定会给tips的。

如果面试官给完tips以后,你想到了另一个能work的思路,哪怕比面试官的更好,千万不要走,一定要按照面试官给的tips写完这题。不然面试官容易生气,觉得悟性不足。不要问我怎么知道的。

其他准备

内推

能内推就别网申。

小问题准备

除了大题,很多公司都会问一些小的tech问题。目的是看看熟练程度之类的。科班出身的人这些都是日常,很多人并不需要准备。但是零基础的人经常并没有实际操作过,是需要系统准备一下的。

去tutorial points看看会问什么小问题(如对比不同语言的gc之类, SVC 函数每个参数具体代表什么之类的)在tutorial points找interview question

https://www.tutorialspoint.com/java/java_interview_questions.htm

也可以直接谷歌搜"XX top interview questions" 。

我当时自己整理了700多个Q&A吧,很多都被问到了。

OS, database, git 与计算机网络

非CS本科的人学OS, database, git 与计算机网络是需要较长时间的。就算时间不足够也一定不能就此放弃还是要准备的。

首先,cracking the coding interview对应的部分看完。

另一个是搜"XX top interview questions", 准备好每个领域最常问的问题,至少top 30问题心里有数。

最后,平时自己刷题的代码就用git管理,一举两得。

tips for 新手: git不是github发明的。

argue

觉得自己表现没有问题,或者觉得面试官有问题,被刷了,可以去和HR argue的。有理有据的情况下,成功率不低。

比如,我谷歌一面argue成功因为面试官的英语我真的没有听懂。

Thank you letter + follow up

面试完之后立即发 Thank you letter,给HR和面试官都发。有个chrome的extension,叫 RocketReach,能找到非常多人的working email addr.

很久没回复就自己follow up 一下,客客气气地没关系的。

简历 & linkedin

CV + linkedin + cover letter一定要找外国人改。

CV改完挂上openCV, CVlibrary, monster等上。

linkedin和挂CV一定要搞好,全世界的猎头和HR都找你的,电话接到手软。

这期间千万不要漏接电话,说不定就是心仪的公司的。

注意背景调查

简历上每一笔经历,入职的时候,背景调查公司都是会细问入职时间和职位的。

所以,

  1. 没有人/银行流水/入职证明能证实的经历,尽量不写。虽然一般背景调查可以选择【我拒绝被调查这段经历】,但是尽量不要去试。
  2. 需要前雇主证明的话,提前打好招呼,客客气气地。
  3. 职位一定要写精确。笔者每段实习经历,都比较随意地填了software engineer,被背景调查公司要求书面说明,为什么他们调查结果,我的职位是intern,为什么和我写的software engineer不符合。令人非常焦虑。最后我现任雇主,出面表示不介意这个出入,背景调查公司才放过这个问题。

时间安排

申请的时候问清楚HR每一个环节要多久,做好时间上的安排,不要留下遗憾。是一个统筹安排的问题。不要因为心仪的公司申太迟而没法等待。

边面边学

初期可以申你本来就不想去的公司,不仅积累经验,有时候面试官人呢贼好,会手把手教你很多东西哦。

“来我考你一下..., 不会?” 掏出一个白板 “来,我教你哦...”