Google面经,已拿到offer哦!

我面的职位是Softwre Engineer, Tools and Infrastracture, 所以开发和测试的问题都会问到

Phone interview 1: 白人小哥.给一个Interval的class, 就是一个区间,左闭右开,比如 [1, 3) 意思是从1到3除了3的所有interger. 让我在这个class里implement一个method, 判断与另一个Interval是否有overlapping. 第二问是写一个method, 返回在Interval 1而不在Interval 2的区域. 一道如此简单的题…因为我前面实在太紧张了全身是汗面的吭吭哧哧…面完以后我都准备move on了, 看来小哥最后还是放了我一码让我有了二面.

Phone interview 2: 白人小哥.更简单了… Leetcode原题Plus One. 如果现在Google要release全新版本的Chrome, 我要怎么保证这个新的Chrome全方位的work?意思就是测试些什么,怎么测试这个新版本的Chrome,才能放心的release出去.最后他还开心的问了我的名字到底怎么念,我就知道大概有个底儿了~

Onsite:
第一轮: 印度哥哥. 大早上的堵了一个多小时开过去腿都麻了,上来就开始coding,直接蒙圈儿. 第一题, 给一个array比如[4,2,1,3,5],根据这个array现在我们能有了一个新的array => 每个数是在原array里, 在它左边的所有比它大的number的个数,就是[0,1,2,1,0]. 题目是现在给了这个[0,1,2,1,0]要求原array, 原来array的range是1~n. 第二题, 知不知道binary search? 但是现在array是unsorted的可是依然看做sorted array来做binary search,返回在array里面所有可以在这种情况下binary search出来的数.

第二轮: 韩国哥哥. 经典的地里出现过的String压缩编码解码类似题, 后悔当时看到没有好好写过一遍.给一个String比如"abcdfffffffxyz", 写两个methods, encode和decode. encode就是比如"fffffff"变成"7xf",decode就是要变为原字符串.我说"ff"怎么办,他说变成"2xf"你不觉得更长了吗? 我才明白了,应该是encoded后的String要比原来的短,不然为啥要encode,的亏我问了这个问题…然后又问他,如果原String本来就是"5xt"这种结构, decode不就无法辨认了吗?他说很高兴你提出了这个问题,但是不用管它,一会再讨论,先写吧. 写完以后他就问我如果原String本来就是"5xt"这种结构,我encode应该怎么处理? 我就傻了…因为一直觉得encode后的字符串长度一定要比原来的短,所以根本想不出来他要的解法. 说了四五种方法他都不满意,最后给我hint说,要是有个"1xt"这样的你怎么处理? 当时脑洞大开想出来了… 其实是要变成三个"1xt"这种结构,比如原String就是"5xq", 就encode成为"1x51xx1xq"就好了. 但是这种方法违背了encode后要变短的rule,所以我是真没想出来… 还讨论了好多种情况, 最后一种是"1aaaaa"这种情况怎么变, 我说"1x15xa". 他说这是6个字符,能不能只用5个? 实在想不出来,这时候第三个小哥进来了,韩国哥哥就过来告诉我说,其实看做1a和aaaa两部分encode就好… 面完我就觉得跪了…

第三轮: 中国小哥. 第一个问题是测试的,比较简单. 测试Calculator,input就是比如俩数一个operator, 都有什么case, 怎么测,应该有什么预期结果或错误. 第二题, 一个array,rearrange成为另一个array, 现在给了这两个array, 求是怎么变化成第二个array的. 挺简单的就用了Hashmap秒了…
然后问我,那现在给你原array,也知道了是怎么变化的了,所以我们现在可以用原array求出变化后的array对吗? 但是我要run这个method好多次比如k次, 怎么最快能求出array被rearrange了k次以后的结果? 最后我就推倒出求LCM. 面完他亲切的用中文跟我说,我是他见过面的最好的,时间复杂度最低trade off也说的好. 谢谢小哥给了我信心~么么哒~

第四轮: 印度姐姐. 假装没有准备的样子现场想题目… 谢谢姐姐没有对我下死手T T 海上有一片岛, 每个岛就是一个node, 岛和岛之间有的连着有的没连着. 所有连着的岛是一个Group. 求在这片海上,
包含岛屿个数最小的group的岛的个数,和最大的group的岛的个数. 就是返回两个个数值, 肯定就是int[2]嘛. 先讨论了用什么数据结构存储, 跟她说了trade off. 然后开始写. 全程想给我挑错, 不断质疑我的代码… 还好我这一轮在高压下还是写的极其顺畅, 一个bug没有出现, 对她也是笑脸相迎, 躲过一劫…

第五轮: 中国大哥. 竟然中文给我面试, 也是感动哭… 第一题, 一个二维数组代表了一个岛. 周围都是海, 岛的左侧和上侧通向Pacific, 右侧和下侧通向Atlantic. 每个数字都代表了那个位置的海拔高度. 现在下雨了, 雨只有从海拔高的地儿能流向海拔低或者一样的地儿. 返回岛上的分水岭的点, 就是在某个/某些点上, 雨水既能流进Pacific, 又能流向Atlantic. 大哥可能也知道白板写不下,让我写纸上. 足足写了4页A4纸,当然字也写的大…手都写疼了… 第二题, 给个Google map, 你就测吧… 我的offer效率很高我完全没想到, 5个工作日从onsite到签offer, 真心感谢hr姐姐. 因为我有个WalmartLabs的competing offer正好是那天截止, hr的意思也是我的feedback很好,所以HC没有犹豫,也马上有组想要我, 所以hr加班加点在进HC当天就跟offer team合作把offer弄出来了. 这里再次感谢各位面试官对我高抬贵手, 以及WalmartLabs…

下面是求职总结 自我介绍一下. 毕业快两年了. Master读的是普通学校的水专业Information Science. 我是极其水,几乎零基础,项目都抱别人大腿, 当时没有好好学习知识, 现在别提多后悔了… 去年开始找工作的时候, 连HashMap是什么都不知道… Leetcode就刷了七十道, 总拿女生不要太累了要不就这样吧这种谎言安慰自己… 找到了现在的SDET工作,公司和待遇自然也是好不了. 今年三月开始奋发图强, 八月初开始投简历, 十月十五日当天拿到Google和WalmartLabs的两个offer
(对没错,WalmartLabs真的不给考虑时间,当天deadline). 总之是零基础, 靠努力学习和坚持不懈活了下来. 如果你跟我的情况类似,希望我的经验可以帮到你~

CC150 . 看了一遍version 5. 据说新版本v6页数多了一倍… 还是希望大家坚持把每一章都看了,对新手帮助很大.

Leetcode . (没有做过Lintcode等等, 我觉得选一个刷题网站全弄会了其实就可以…)
三月到十月共刷5遍,订了subscription,每遍仔细做了每一道题. 过程确实相当痛苦,每天还要上班,一有空就得刷题,周末也不得停歇.
尤其前两遍,基本都是看完答案背着写一遍的,可能也是因为我比较笨… 但是幸亏坚持下来了~ 当我做到第四遍的时候, 有一种通了的感觉, 即使拿到一道新题, 也能比较快的有思路. 这里还是希望我们找工作的朋友们好好刷Leetcode, 弄通弄懂算法精髓, 举一反三.
不要有侥幸思想, 非牛人刷了一遍就想找到非常满意工作的真的少之又少.

Geeksforgeeks . 讲解非常清楚明白易懂, 尤其在学习数据结构和算法上面帮助很大.
它对于很多算法都会有一系列的问题的讲解, 看过之后基本对于某一部分的题目都没什么问题了. 比如Trie,BST的讲解, longest common subsequence一个系列,KMP算法等等,我都是得益于它.
一个算法想不明白,可以先去搜搜geeksforgeeks有没有讲解

Data structure & Algorithms . 最基础也是最重要的部分, 千万别小瞧基础.
为什么一再强调数据结构与算法基础? 就算刷了十遍leetcode/lintcde等等刷题网站,面试还是会有没见过的题的.
遇到完全没见过的题该怎么办,没有强大的基础知识储备,怎么看穿这道题的本质,怎么很快有思路? 一切都要靠基础, 甚至比刷题本身更重要.
每个数据结构一定要做到彻底明白概念, 结构, 功能, 怎么用. 一定要亲自在IDE里面至少implement一遍!! 推荐书目:
我精读了Data Structures and Algorithms in JAVA. 非常适合初学者,
每个数据结构的实现和用法都写的极其详细. 精读了每一章, 并且implement了两遍里面所有数据结构.
我也听有的人说精读Introductions to Algorithms, 但是这本书感觉不是很适合我这种初学者…
如果你有基础或者是科班出身,面试之前详读Intro to Algo我觉得会很受用的. 刷题的过程中,会遇到很多没见过的算法和数据结构的用法.
比如说graph, 在leetcode里面会有用到dfs, bfs, topology, dijkstra等等算法, 每当遇到一种没见过的,
就脱离这道题, 去网上搜索这究竟是什么, 怎么实现的, 怎么用, 在IDE里面自己亲自实现算法本身, 很生疏的算法要多实现几遍.
这个过程是让我提高最大最快的一步.

Java Conception . 内推我Google的大牛朋友让我看Thinking in Java和Effective
Java这两本书. 虽然没有看完,但是确实是非常棒的两本书, 尤其是Thinking in Java.
据说每看一遍都会对Java有全新的认识, 非常值得一看. 如果实在没有时间,只是为了面试紧急补课,
至少看会这个网站的Java面试题http://www.programmerinterview.com/

Big Data .
今年以来,我发现几乎所有公司的面试都不约而同的添加了大数据相关的问题,就连Walmartlabs的SDET职位的面试中都遇到了,不得不说大数据真是现在一个很猛的trend…
在面Bloomberg的时候就是因为大数据的问题不会而吃了亏挂了,回家以后恶补了很久… 这里推荐这个blog,很多朋友都应该看过:
http://blog.csdn.net/v_july_v/ … 82693
我很想知道写这个blog的是个怎样的人,真心膜拜… 他的总结几乎囊括了所有大数据方面的知识背景,实在赞叹.
对于这个帖子里面提到的知识点,他都有专门介绍的链接,全面又方便. 如果想面试无敌的话,每个知识点都要自己多查资料弄懂,每道题都自己过一遍.
对于里面提到的不同方法要多比较, 每种方法什么时候适用, trade off是什么都要清楚. 重中之重是Map
Reduce和External sort.

Thread & Locks . 考得不多但是面ebay碰到了. 主要知识点: thread和process区别,
multithread, lock, semaphore, 对resource分配, deadlock, 怎么解决/预防deadlock.
还有BlockingQueue 和 Producer-Consumer经典题要会implement. 这里有几个经典问题:
http://www.careercup.com/quest … 87648
http://www.careercup.com/quest … 96992

OOD . 老老实实实现了两遍Singleton, Factory, 还有MVC pattern.
设计一个class应该也算在OOD范围里: 写过无数遍LRU, Trie, Iterator, BST以及变种,
BlockingQueue等等, 生怕被问到…

System Design . 这个对不住大家,我最后没面到过系统设计,所以不太知道自己这点准备到底充不充分…
如果你要面Facebook几乎肯定是要考系统设计的,还是得好好准备. 一定要看FB的engineering blog, 看的越多越好.
基础的概念至少要会: load balancer, cache, memcache, consistent hashing, round
robin, master slave, sharding, pre-computed, map reduce, difference
with SQL/NoSQL… 有很多牛人总结的系统设计帖,我就不多置喙了,这里推荐几个帖子.
http://massivetechinterview.bl … .html
http://www.mitbbs.com/article_ … .html
http://blog.csdn.net/sigh1988/ … 90337
还有这个公开课,太棒了,新手入门必备,谢谢成哥推荐~
https://www.udacity.com/course … 37165

Resume . 就一点,要把自己简历上每个项目都弄熟, 写下项目介绍背下来, 这样被问到的时候可以张口就来.
也要把你要面试的单位的简介自己总结一遍背下来, 还有你为什么想来我们单位, 如果你有工作你为什么想跳槽, 你觉得为什么适合这个职位等等.
其实这些都是标答, 只要好好准备过一次就能适用于各个公司…

这里有一个我总结的软加分项. 尤其对妹子, 说实话妹子是可以很占优势的, 特别如果你是个漂亮妹子~
你的性别,说话的态度,眼神,都可以成为你的加分项, 一定要利用这一点.
为什么我突然说这个,不是说这只是个锦上添花的事情,而是因为这个点非常重要,其实男生也一样.
一个面试官想要找的不仅仅是能够做出题的人,更需要的是找到一个合适的teammate.
你是不是好说话,是不是能聆听而不是一味反驳别人坚持自己,是不是能马上接纳别人,接受别人的idea并且有接受新知识的能力,从某些方面来说,比仅仅能做出来这道题重要得多.
所以面试的时候, 那天早上就告诉自己今天是去跪舔的,别耍态度,如果你是大神可以除外… 最好全程微笑,遇到不会的题的时候更要微笑.
把想题的过程全部说出来, 不能成为心理活动, 让对方知道你在非常努力的思考, 而且态度很好, 所以就算你没有完全想出来, 他是非常愿意给你hint的. 态度决定很多事,甚至人生.

好啦,我啰啰嗦嗦了那么多真是不好意思T T…
但愿这篇总结能给任何人一点点的帮助我就没白写~多努力就有多幸运.希望大家都能坚持到底,不倒在黎明前,最终拿到很多大offer,进入自己梦想中的公司,开启人生新的篇章!完。

1 Like

Round 1:
coding problem:
Given an input string, find out the longest palindrome by deleting any characters or swap any pair of characters of the input string.
同一轮有个讨论题,假如有个摄像头可以截取城市某个特定区域的夜景图,现在给我们两个夜景图片,可以抽象成两个M * M(摄像头可拍摄区域大小 grids/matrix ,M1, M2。摄像头是在移动的,所以M1,M2不一定代表同一区域,而抽象成的matrix由0,1组成,1代表这个区域亮灯,0表示不亮灯
M1亮灯的区域在之后不一定还亮着,原先不亮的也可能会亮起来。问从M1到M2,摄像头最有可能做的线性变换/移动是怎样的,最有可能是通过,假性变换后,M1变换成M1’, 去看M1’和M2的overlap的1的个数,多的话,可能性就高。

Round 2:
Given a word and a dictionary, determine if it can be composed by concatenating words from the given dictionary.
follow ups:
每次对于一个特定位置(sustring 0,…, i),都要回头看之前的每个子问题(j < i), 效率很差,怎么提高。
提了下把substring 0… j是true的j放到一个list里,每次都去看list里的那些j对应的子问题。

Round 3:
给两个interface,

  1. Interface Callback {
  2. execute();
  3. }
  4. Interface AsyncTask {
  5. onComplete(Callback callback);
  6. }

Q1:
如果有两个有dependency的asyncTask,怎么实现
Q2:
如果有一个list of asyncTasks, 彼此之间没有dependency,怎么保证它们全部执行完了之后可以print out “hello world”

Round 4:
有个游戏,是有一个input string(比如“a8*&b”, string里有letter,digit或者其他的各种字符),还有wordList words,需要找到wordList里 input string里所有的letter的最短的string/word。