Skip to content

Instantly share code, notes, and snippets.

@jianminchen
Created September 20, 2018 00:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jianminchen/bc554a773bfd13b03dd0ac98b49ad29a to your computer and use it in GitHub Desktop.
Save jianminchen/bc554a773bfd13b03dd0ac98b49ad29a to your computer and use it in GitHub Desktop.
Google offer, Leetcode practice, contest player
http://www.1point3acres.com/bbs/thread-443485-1-1.html
[经验总结] ECE硕士从找工作碰壁到拿到Google offer
(2)我自学了什么?
在刚毕业的时候,我对CS了解有限,尝试面试了很多公司的software职位,屡屡碰壁。在地里大佬经验帖以及逐渐积累的面试经历帮助下,
我找到了我需要加强/自学的东西,我个人总结成5个方面。
一个重要的前提是精通一个编程语言,我从嵌入式C转为C++ 选择编程语言的过程中在C++与Java之间有过纠结,但当时的我认为C++与C更像,
更容易上手
1. 算法与数据结构 (最重要的一环,所有的面试都会与之有关)
2. OOP/D (一开始我几乎完全不了解这是什么,也很后悔硕士的时候没有选OO这门课,有些面试还会涉及到design pattern,但是如果没有
几年的工作经验以及一定的代码量,很难对design pattern有深刻的认识,所以在Junior position的面试中只需基础了解)
3. OS/多线程 (有ECE经验,基础还算扎实)
4. 数据库 (完全不会,自学MySQL,不精,对某些面试会有帮助)
5. 网络编程 (有ECE经验,基础了解,但我平时不是很常用)
如果用一个公式来概括software engineer面试大概需要什么的话就是 offer = 精通一门OO编程语言 + 非常强的算法与数据结构基础(包括
写代码的能力)+扎实的OOP基础 + (一系列其他加分项)+ 有效的交流
总结下来就是 算法与数据结构贼重要,OOP/D大多数面试都会涉及到,其他的部分不是所有的面试都一定用得到,但推荐至少有基础的学过。
当然,如果你申请的职位与某方向有关(比如网络工程师),那计算机网络这个方向也会特别重要。
(3) 我做了什么?
自学,查缺补漏+刷题-google 1point3acres
刷题是短时间提升你写代码能力以及面试能力的最有效的手段。直到刷了几个月题以后,我开始后悔为什么这么晚才刷。虽然有人会觉得刷题应付
面试有些功利,但我觉得刷题是对你算法与数据结构能力的一种考察,也会对你谨慎全面思考问题的能力、逻辑思维能力有所帮助。 如果你的CS
基础很好,刷题不会对你的水平有很大提高,但是会帮助你快速的理解问题,将问题转化为逻辑模型,并用代码实现的这些能力有帮助。以Google
面试举例,有些Google的面试题很贴近生活,就好像你日常工作会碰到的问题一样,虽然考察的知识点也许不难,但是你需要在45分钟的时间内
分析问题,与面试官交流细节,给出思路,写出代码,用test case简单测试,最后分析时间/空间复杂度。如果你给出的不是最优解,还会要求
你优化。 如果你经常刷题训练自己,你的反应会更加迅速,拿到一道题就能有思路,提起笔就能开始写代码,这样你会有充足的时间去优化、去
和面试官交流。 熟练的写出robust的代码>会做这道题。. 牛人云集,一亩三分地
(4)我是怎么刷题的?
我刷题主要在leetcode。小弟才疏学浅,水平有限,与刷过几遍leetcode的大神不能比,目前leetcode进度70%,每周参加Leetcode Weekly Contest,
名次大多在100-200之间,最好一次前30(佩服一下ASM大神们)。稳定做出前三题,最后一道hard题看状态。. from: 1point3acres
1. 简单题。 对于新手来说,简单题是最容易上手且最容易做出来提升自信的题目。第一遍刷可以以AC为目标,但是我建议在刷题一段时间以后,回过头
来看一看自己以前做过的题有没有更好的解法。我用某公司的onsite亲身经历来证明这一点。 题目如下,给定字符串A和B,A与B几乎相同但是仅多了一个
char,求这个char。 这道题放在leetcode会是一道简单题,做法多种多样。在面试时,我先给出面试官两个最straight forward的解法,hashmap存char,
A+B-,找出count不为0的char 以及 pointer遍历两个字符串。随即又想到了异或的做法。 面试官要求继续优化,我想到了与binary search有关,
先设定字符串中没有duplicate,用binary search解决,之后对于任意字符串用binary search将时间复杂度优化为 average case O(logn) worst case O(n)。
一道简单题在面试给出了4种解法,面试官expect的比一道简单题更多。 简单题会有不简单(elegant)的解法。
2.中等难度题。 大量的去刷。这个难度的题与你面试中遇到的问题难度最为接近,你可以把这个难度的题当作面试的模拟。
3.难题。 我个人把难题分为几种:好题、题目本身不难但是test case极为复杂、题目很巧三个类型。. 留学申请论坛-一亩三分地
好题认真刷。什么是好题呢? 高频题或是不符合其他两种类型的题都算是好题。
题目本身不难但是test case极为复杂 ex leetcode atoi 题目本身不算很难,但是你需要应对各种各样的test case 这类往往在leetcode通过率较低。
如果你的面试时碰到了这样的问题,最重要的是和面试官交流,搞清楚如何应对每一种输入。负数怎么办,会不会出现小数,有leading zero怎么办,
overflow怎么办等等。
题目很巧,这类题很tricky,如果你掌握了某个性质或者灵感爆发发现了某种规律,你1分钟就能做出来,但是如果你没有灵感爆发,你将做不出来这种题。
这种题可以直接看答案了解一下就好了。以谷歌为例,谷歌明确表示了自己的面试不会出brain teaser或者 A~ha problem,就是指的这类题。
在刷题的过程要给自己时间的压力,通常一轮面试45-60分钟,可以参加weekly contest锻炼自己的有限的时间内写代码的能力
(5)我是怎么面试的?
不同的公司面试流程不同,有的公司喜欢问知识概念题,比如阐述一下xxx是如何工作的,有的公司喜欢问bq,比如亚马逊14条军规,但是几乎所有公司的
onsite都会白板 coding。
我应对白板问题的流程大概是:
面试官提出问题 -> 我重复面试官的问题并尝试转化为数学/逻辑模型 -> 想一个基本的test case 与面试官讨论expected输出 来保证我确实理解了题目
-> 与面试官讨论assumption(比如输入是否保证valid,会不会出现overflow)-> 想几个corner case,一会写代码的时候需要注意 -> 给出一种思路
(可以不是最优解)-> 写代码(think out loud 边写边解释)-> 用之前的test case跑一遍 -> 分析时间/空间复杂度 -> 面试官提出follow up或者
优化 -> just do it
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment