12/2017 - 01/2018 Google 电面汇总
题 源来自一亩三分地以及geeksforgeeks
1/18
给两个char array,其中有一些char为backspace就是删除前面的字符,要求输出一个boolean判断两个char array是否相同,时间要求O(n) , 空间要求O(1)
例如:
[a,b,'\b',d,c] 和[a,d,c] true
[a,b,'\b','\b','\b',d,c] 和 [d,c] true
[a,b,d,'\b'] 和 [a,d] false
先给了用Stack的方法,TimeO(n), SpaceO(n),没让写code
之后要求TimeO(n), SpaceO(1),po主试着从前往后parse没成功,好久之后小哥给提示从后往前parse
1/12
給你兩個string
if function(s1) == function(s2) return true
else return false.
function做的事情 遇到b 就刪除前面一個字元 其他就不管 當b太多的時候 return ""
for example
accc => accc
accb => ac
abdd => dd
如果string 非常大
無法fit memory 怎麼辦
答案: 用iterator 然後從後面開始讀
不過hint 從後面開始的 iterator 隔了20min才跟我說 從前面我怎麼試 都不行
10/31
Build robot: you are given a list of parts of the robot, and for each part, you also have a list of parts needed to be finished before building this e. Find out the order
题很简单,就是topological sort,问了时间空间复杂度
12/31
问了一道题
给一个数组,n的长度(n >=1),含有所有1 - n的数字,要求得到一个最小的index,满足条件: 如果把数组小于等于index的部分排序好,并且把数组大于index的部分排序好,那么整个数组就排序好了。
看题目可能有点绕,以下是当时给的两个examples:
3 1 2 5 4
返回的index为2,即如果(3,1,2)和(5,4)分别排序完成,那么整个数组就排序好了。
2 4 3 1
返回的index为3
注意由于含有所有的1-n的数字,所以数组里是没有重复元素的。
1/17
刚面完GG,399, evaluate division,就是把字母换成了币币之间的汇率,建个map 存下edge, graph dfs 或者bfs,搜索一下。
gg的风格感觉变了,不能一上来就写题,他会要求我问一些关于这个input,output的问题,感觉这个答得不好。很快写好代码,面试官特意强调不写代码,接下来讨论,如果有多条路径都能从起点到终点,但是得出的转换汇率不同,这种情况你怎么处理。我反正懵逼了。。当时我就以为他要找个最短路径,他说不是。之后我说那就返回这些路径结果的平均值。他又说不是..我就反问他,这题设有问题吧,这汇率转换,虽然路径不一样,但是结果应该 一样的吧。之后他说不同的交易所肯定有价差的呀,他要的是,最低的汇率,和最高的汇率.... 原来他是想搬砖套利赚钱..目测面试官是个玩币的
1/18
题目是 increasing triplet subsequence。
这个应该是地里的老题了。然而悲剧的是,我并没有见过这道题,当时给我的时候,我是硬想了一个算法。时间是O(n)但是空间也是O(n)。后来在面试官的提醒下,把空间降为了O(1),不过也没有时间写代码了,就这么结束。
11/18
刚刚结束的电面,人品爆发遇上亚裔小姐姐,英文巨好,应该是abc.
上来让自我介绍一下,然后做题
类似利口 64 不过是求最大和
8/16
Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. The robot cleaner can move forward, turn left or turn right. When it tries to move into a blocked cell, its bumper sensor detects the obstacle and it stays on the current cell.
The control API:
interface Robot {
// returns true if next cell is open and robot moves into the cell.
// returns false if next cell is obstacle and robot stays on the current cell.
boolean Move();
// Robot will stay on the same cell after calling Turn*. k indicates how
// many turns to perform.
void TurnLeft(int k);
void TurnRight(int k);
// Clean the current cell.
void Clean();
boolean Move(Direction d);
}
sample input
++++++++++
+........+
+...^....+
+.+......+
++++.+++++
+.....+
+++++++
要求用给定的API打扫完所有empty格子。
楼主一开始想用bfs做,后来发现我连robot的位置都不知道。。
于是面试官简化
简化1:robot自己可以知道自己当前的位置。就是两个新API:robot.x(), robot.y()
楼主到这里还是一脸懵逼,于是面试官又提示:你怎样让robot从一个点走到格子里的另一个点。
楼主最后磕磕绊绊把最后一个提示想出思路来了,但是没写完就到时间了。
1/6
第一题,后序遍历二叉树,要用迭代法来做
第二题,给一个数组,里面可能有重复的数,实现int pick(int target),返回target的index, 如果target出现多次,要求返回每个index的概率一样
比如:{1, 2, 3, 3, 3}
pick(3) 要求随机返回2, 3, 4其中的一个,并且概率一样
1/17
电话面试一共45min,一共面试了60分钟左右
首先介绍了一下做过的项目,大概10min时间吧,主要考察个人表达能力吧
然后做题,在Google Doc上写代码,问题大概是,美国大选,有很多选票,Vote,每个Vote有两个属性,一个name一个timestamp,表示投票给谁以及投票的timestamp
大概问了三个问题
1.给定一个timestamp,找到这个timestamp之前的得票最高的人,借助于HashMap实现即可,说了下思路,不需要写代码
2.如果是给定一个timestamp,找到Top K的投票最多的人怎么办呢,corner case是如果有两个人投票一样怎么办,基本思路是HashMap统计每个人得票次数,刚开始考虑用Heap来实现,找TopK,但是追问,如果投票相同的人算一名,找Top K名改怎么找,思路是用TreeMap来实现,用数量作为Key,值是List,然后又追问,如果不考虑数量相同的人,怎么找Top K,除了用堆之外,还有没有其它更好的方法,答用类似Quick Sort的找第K大算法,感觉还比较满意,写代码实现一下
3.如果给定的是一个List of name,name按照投票数量从大到小排序,找到一个timestamp,使得到达这个timestamp之后,Top K的人选和给定List一致,基本思路就是先排序,然后不断的用HashMap和TreeMap做统计,如何添加和删除元素,分析时间复杂度.
然后让问我有没有问题,原来不是一个team的同学面的,所以就问了下,在Google每天的工作状态是什么样的,大概介绍了下,感觉还是非常自由的,最后遥祝了一下,Good Luck!
1/17
刚结束的狗家店面,国人大哥出的原题, 人挺nice的
蠡口恶气就
楼主当时想dfs,bfs都可以做,想都没想就直接bfs了,后来想了想好像dfs简单很多。面试官大哥估计没想到有人拿bfs解,我拿bfs写完之后一直说very good, 估计心里想的是“还真有二货用bfs解这个题”。
1/17
中国大姐 上来就做题,binary tree serialize and deserialize
9/18
9.18电面,白人小哥准时打来,没问简历直接上题。一道题,有个整数数组,求是否在其中有出现频率至少是N/4的数字,N是数组长度。lz和小哥依次讨论了brute force,排序,和二分方法,前两个写了代码和test case。在讨论二分法时,小哥假定数组已经排好序。lz想的是出现频率至少是N/4的数字应该不多于4个,从左右两端向中间二分同时检查左边相同数字的个数。然而时间太短了这个没说好。。估计也不对。。面试官的想法是从最左开始以N/4的跨度向右边扫。如果左右两端数字相等则返回true,否则二分查找区间内第一个元素在数组中首次出现的位置,再用N/4的跨度查下去。。不过lz觉得还需要查区间内最后一个元素,比如遇到[3,4,4,4,4,4],总是从3开始查的话就死循环了。后来在leetcode上看到了相似的题目majority element,discuss里面的解法个人认为还是更好一些。希望能帮助到大家吧。
12/17
设计一个类
class EncodingChecker {
EncodingChecker(String pattern) { ... } // constructor
boolean isEncoded(String s) { ... } // for any string s, check whether s is encoded from pattern, see below
}
pattern = 'abcabc'
s = '123123' -> True.
二问:如果pattern不是一个而是一百万个,怎么写isEncoded?
12/16
第一轮两道题,一个数组中有重复元素,指定元素的重复次数(非常巧和BB的电面一样);第二题是给出n个数的全部排列,脑子有点抽和nextPermutation想混了没写完
当晚收到邮件挂掉但是给了加面
第二轮只有一道题,一个数组非常长,给订一个目标值求加和超过该值的最短连续子数组,写出来之后follow up问当数组特别大要跨主机存储时该怎么搜索,说了一下思路当晚就收到邮件过了,目前正在加紧准备,希望一月有个好结果
1/12
一个多小时前刚刚结束的狗电话。楼主16Fall转的计算机,申请的是18年的SDE NewGrad。
一道完整的题,一点点的展开,很狗,很狗。
让我写一个"人"类,含有名字跟年龄。用private+setter/getter,楼主琢磨考encapsulation
让我写一个“码工”类,楼主琢磨考inheritance
让我区分“码工”类里面,各种variables跟methods,是public/protected/private/default和why.
让我写一个"给予"跟“接收”的方法
把第四步的方法,多线程化,考multi-threading + synchronization
哪里会锁死和如何解锁 (时间到了,就没细问)
10/12
一道题
有一个游戏,有人名和分数,实现两个function
void update(String name, int score).
int getByRank(int rank)
Last updated