谷歌2017面经题集

发个Google onsite 面经给需要的人。
round 1: 国人大哥, 出了道 merge N 个sorted element list的题, 要写成Generic的形式。 第二题是leetcode 256. Paint House, 只不过他要输出path就是最少cost的具体方案。第二题说是没时间了只让我说了下思路解法。

round 2: 国人, 出了道大题, 光搞清楚题意就搞了半天: 把你有没有pass考试这条信息通过一群同学传给你妈妈,每个同学可以选择说实话或者谎话每个同学可以选择告诉另一些同学或者直接告诉你妈妈, 然后最后你妈妈会告诉你最后告诉她的同学说了什么(即知道最后跟你妈妈说的同学是说了实话或者谎话) 问最后有多少同学说了谎,撒谎的同学的概率。最后也是没时间写完了。

round 3: 白人, 好像背景是道经典的数学问题: 一个数,如果是偶数就除以2, 如果是奇数就乘以3加1. 直到出现循环重复。然后第一问就是给个数然后这个数到循环前要多少步。第二问好像是给个数看是否这个数会出现循环(记不太清了, 但是问题很简单不难),然后就是问了下如果优化。
.1point3acres缃
round 4: 三姐, 那浓浓的咖喱味。。。 问了道经典的3sum smaller. 然后leetcode 490 the maze
. From 1point 3acres bbs
round 5 可能是国女吧, leetcode 394 Decode String

我的题整体来说并不难,希望能帮助到大家, 顺便能给点分我哈

 

第一轮
163,269,老白不懂拓扑排序,解释一通,没写完
第二轮
java gc
抽象类和接口的区别,很多细节
unit test时好时坏怎么办,看随机数,Date, 多线程
算法 238
第三轮
烙印让设计一个订票系统,各种表,不过感觉烙印有点弱,也不太懂,开始说不管性能,最后剩5分钟开始问性能,几乎要重新设计,轻度被黑
第四轮
跑得快,手上一堆整数,能不能全部分成顺子,顺子是3个以上连续数。
第五轮
200k个字符串,找到最小的会文字串,还要同时包含所有的字母(字母集合可能不止512).

 

Onsite 5轮,楼主工作以来的两年多主要都是做web client的,背景偏向front-end,虽然表达了不局限于front-end想找full stack的职位,recruiter仍给match了Web Front End的方向。楼主用javascript刷题面试,这五轮里也都有涉及前端相关的知识点。
第一轮:亚裔面孔小哥哥。javascript event callback。提供一个方法getLocationName(lat, long, callback)。callback里面的传回的参数是在这个坐标上的城市的名字。输入一个数组的坐标,要求按照输入数组的顺序一一打印出每一个坐标点所在的城市的名字。
第二轮:美国小哥哥。(1) lc 159变形。find the longest substring with at most two instances(a character provided) in it. (2) 数组里不相邻的数字相加可以得到的最大值
第三轮:亚裔面孔小哥哥。解释cdn,javascript bundler, javascript event. 做题。给一个平行于x轴的矩形,要求随机生成一个矩形内的坐标点。follow up:给一堆不相交的平行于x轴的矩形。要求随机生成一个坐标点在任意一个矩形内。落在某一个矩形内的概率和矩形面积成正比。

.午饭:亚裔面孔老哥哥。听老哥哥说他的一个同事当年面完google以后回家病了三天
第四轮:亚裔面孔小哥哥。判断两个query是不是同义。给一个list的同义词数组,比如[[fast, quick], [rate, percentage]], 输入两个string queries,根据同义词数组来判断这两个query是否同义。
第五轮:美国小哥哥。包装过的merge intervals。给一个string和一堆substrings,如果substring在string里,就把string里面的substring那部分wrap上<b></b>。比如给string:“abcde”, substrings: ["ab", "d"], 要求返回“<b>ab</b>c<b>d</b>e”

简短描述一下最近google的onsiteround 1: 股票交易
round 2: 坐标上一堆点,求能组成的最小矩形
round 3: 同义词,hashmap,union find相关.
round 4: design. 分布式系统维护一个全局id 涓€浜.涓夊垎鍦拌鍧.
round 5: infrastructure相关.1poi

 

1. 给两个字符串,返回第一个在第二个里面discontinous matches的数量。discontinous matches的定义是 (所有匹配的character中没有任何两个是相邻的)
举例:
Input: “cat”, “catapult”. 

Output: 1
catapult => not good
catapult => not good
cactapult => good

. Waral 鍗氬鏈夋洿澶氭枃绔,
2. 类似于range sum query: 有一个无限大的2D matrix,设计一个class并实现update(int r, int c, int val)和sum(int r1, int c1, int r2, int c2)两个function,也就是更新一个位置的值以及求和一个矩形内所有位置的值

六月初onsite。

第一轮:leetcode 10 https://leetcode.com/problems/re ... ching/#/description
第二轮:第一问:二维坐标中给了一个矩形,要求生成一个任意一个坐标点,位置在矩形内。第二问,二维坐标中有多个不重叠的矩形,要求生成一个任意坐标点,位置在这些矩形中,要求生成的点落在各矩形的概率相同。followup:如果提供这两个function,isOverlap(rectangle a, rectangle b) 判断两个矩形是否重合, split(rectangle a, rectangle b) 若两矩形重合,将两个矩形分成互补重叠的小矩形, 问题是: 如何在上述的矩形中加入一个新的矩形. 欏璁哄潧-涓€浜-涓夊垎鍦
第三轮:给定一个0-1 matrix,0表示wall,1表示可以走,问从第一行是否能够找到一条path到达最后一行。followup 1:打印出最短的path。followup 2:如果不是0-1 matrix,0依旧表示wall,而>=1表示经过改点的cost,要求打印出从第一行走到最后一行cost最小的path
第四轮:写一个表示employment的class,其中有三个method: makeManager(p1, p2): 将p1安排为p2的manager, makeColleague(p1, p2): build p1和p2为同事关系, isManager(p1, p2): 判断p1是否为p2的manager
第五轮:给出一组同义词的mapping关系,比如:(fast, quick), (fast, speedy), (learn, study)表示fast==quick, fast==speedy, learn==study, 但是fast!=quick. 要求写一个function判断两个senten是否为同义关系。IsSynonymous(List<List<Strings>> synonymousWords, Strings sentence1, Strings sentence2). followup:如果同义关系可以传递,比如:speedy==quick, 修改上述function。
. 涓€浜-涓夊垎-鍦帮紝鐙鍙戝竷

补充内容 (2017-6-22 13:59):
更正:
第五轮:给出一组同义词的mapping关系,比如:(fast, quick), (fast, speedy), (learn, study)表示fast==quick, fast==speedy, learn==study, 但是quick!=speedy. 要求写一个function判断两个senten是否为...nt3acr

Onsite 5轮,楼主工作以来的两年多主要都是做web client的,

第一轮:亚裔面孔小哥哥。javascript event callback。提供一个方法getLocationName(lat, long, callback)。callback里面的传回的参数是在这个坐标上的城市的名字。输入一个数组的坐标,要求按照输入数组的顺序一一打印出每一个坐标点所在的城市的名字。

第二轮:美国小哥哥。(1) lc 159变形。find the longest substring with at most two instances(a character provided) in it. (2) 数组里不相邻的数字相加可以得到的最大值

第三轮:亚裔面孔小哥哥。解释cdn,javascript bundler, javascript event. 做题。给一个平行于x轴的矩形,要求随机生成一个矩形内的坐标点。follow up:给一堆不相交的平行于x轴的矩形。要求随机生成一个坐标点在任意一个矩形内。落在某一个矩形内的概率和矩形面积成正比。

午饭:亚裔面孔老哥哥。听老哥哥说他的一个同事当年面完google以后回家病了三天

第四轮:亚裔面孔小哥哥。判断两个query是不是同义。给一个list的同义词数组,比如[, ], 输入两个string queries,根据同义词数组来判断这两个query是否同义。

第五轮:美国小哥哥。包装过的merge intervals。给一个string和一堆substrings,如果substring在string里,就把string里面的substring那部分wrap上。比如给string:“abcde”, substrings: , 要求返回“abcde”总体来说聊天气氛都很好,题也比之前想象的简单很多,然而心里还是不踏实呀。求求求

第1轮 API设计. 就是timestamp那一类的 

第2轮 输入是 "+ 1 1 ( * 3 5 4 6)" 这种字符串,有+-*/(). 求值. 也就是求 1+1+(3*4*5*6) 

第3轮 第一题类似regular expression匹配这种的. 输入两个字符串, 输出bool是否匹配 秒了. 

第二题判断两个二叉树是不是相同. O(1) space. 递归不算O(1), 我不会.就要hint. 面试官说, 如果TreeNode里面储存了 Node* parent,你有没有办法. 我就试图O(1) space Inorder遍历. 被卡住了.在提示下磕磕绊绊的最终写了出来. 

第4轮 输入一个6位ip地址的表示形式,输出一个对应的128位整型. 输入可以是这样的"1:a:abcd:23:0:0", 也可以出现::表示省略. 比如"1::2", 等价于 "1:0:0:0:0:2". 输入字符串里最多出现一次省略符:: 

第5轮 输入是一堆各自形状的二维俄罗斯方块. 问他们能不能组成一个正方形. 我用的dfs+回溯.面试官顺便考察interface设计. 比如怎样用数据结构表示俄罗斯方块, 怎样表示旋转. 怎样增加可读性,之类的.

1 把一棵随机的树,变成一个string序列,使得这个序列能够reconstruct the random tree. random tree 就是说这课树的任意节点可能有多个子节点

2 颜色那一题, “red” 可以写成 rgb(255, 0, 0), 可以写成“#FF0000”, 也可以写成 “#F00”的缩略形式, 其中给了一个dictionary 的map, 你可以用map: key 是“red”, value 就是“#FF0000”. 其中涉及到把10进制数变成16进制数,

3 design a snake game using javascript

4 滑动拼图游戏,向一个方向滑动,使得相同的数字合并,比如 2 和 2 可以合并成4[ 1, 1, 2, 2 2, 0, 3, 3 0, 0, 1, 2 3, 3 , 1, 2 0 代表是空的不能合并上面数组向左滑动就变成了[2, 4, 0 , 02, 6, 0 , 0 1, 2, 0 , 06, 1, 2, 0

5 设计一个自动扫地机器人来清扫房间,要自己建模比如robot一开始的坐标是(0,0), 而机器人并不知道这个房间的人和情况,你要让robot清扫房间,并且要知道什么时候房间的每个角落都走到了。

链接: https://instant.1point3acres.com/thread/255772

共五轮,全是算法 

1. strStr变形,类似找max prefix,返回 开始的index, 还有最长的match长度,interviewer很cool, 就让我用暴力解法,但是问了有什么高效算法,我说kmp, 问了我kmp 复杂度 

2. 写一个函数验证是否是合法的encode形式, 比如 secret 是 “abc”, 给你 “xYz”这是合法的。 如果给你“xyy”, 就不对,不是 1to1 mapping的。lc上应该有这道题。题号忘了, follow up 是如果有许多的测试用例,怎么能加速。比如给你一堆 “xyz”, "qpj"...., 等等,问你怎么优化,并且写了代码 3. maximum window size with k distinct character. lc 原题,没什么好说的,follow up, 如果window size 非常大,怎么办? 

4. 两个题,给你一个树,让你返回所有 单调递增的path, 从root 到leaf. 简单,就是dfs backtracking 就行。 第二题类似merge interval, 不过加了个高度, 高度可以叠加,让你merge 完返回最大的高度。这题写了一半,没时间了,告诉了面试官思路。 

5. merge 2 streams, merge k streams. 跟merge sorted list 和 merge k list 一样。但是自己design 一下需要的 stream interface.

前两天的面经

1. 国人大姊,找数组之中的峰值,倒转一个句子,形式是一个list

2. 白人哥哥,设计类似像是宝石方块的游戏

3. 白人哥哥,类似128的最长连续(Longest consecutive sequence).

4. 国人大哥,找一个tree是否为另一个的sub-tree,大哥很友善,过后还用中文聊天了一下,感谢大哥没有下死手

5. 白人哥哥,创造迷宫

 

 

背景:本人UCLA硕士毕业,在Apple工作3年半。17年上半年Google recruiter联系我的,然后写了几个reference,感谢各路Google朋友的不杀之恩,直接onsite

第一轮: . 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
LC261变种,directed edges
第二轮: . 1point 3acres 璁哄潧
Check if two DOM Trees have the same text.
e.g. <html><p>hello</p></html>, <html><p><b>h</b>ello</p></html> should be the same text.鐣欏璁哄潧-涓€浜-涓夊垎鍦

给了DOMNode class definition (string tag, string text, bool isText, vector<DOMNode*> children). 你得自己想怎么structure DOMTree

第三轮:
Decompress 2[a3[b]c] => abbbcabbbc

第四轮:
LC120变种,120. Triang 三角变成菱形

第五轮:.  1point3acres.com/bbs
ROTn,输入[abc, bcd, aa, bb, zz] 输出 [[abc, bcd], [aa, bb, zz]]

 

 

直接昂赛,

一轮check subtree,讨论愉快。降低复杂度。
二轮统计票数,票按时间源源不断来。输入一个时间段返回这段时间票数最高的。信息就这些on your own。这轮面试官很不耐烦又不愿意用中文;
三轮汇率转换。LC399 Evaluate Division
四LC 340. Longest Substring with At Most K Distinct Characters

EE转专业狗刷了N久的题准备google, 还是跪在Onsite了,来贡献一下面经
提早一天飞到san jose,给安排的房间那个床so fancy,左右两边独立调软硬,然并卵,几乎失眠的一夜第二天来到CL1300, 也就是google infrastructure部门, 没啥warm up,直接上题,题也都很裸

第一轮:
1. 实现一个class, 支持 get(key),   put(key, value),delete(key), getRandom()四个操作。用了hashmap 跟 Arraylist, 删除时候跟队尾swap一下达到 四个O(1). 鍥磋鎴戜滑@1point 3 acres
2. A="abcde" B="abcxde" 除了x其他字符都一样 找出那个x. 1point3acres.com/bbs


第二轮:
1. longest substring at most K distinct char. 高频题,快慢指针+hashmap计数。 优化点做法就是用双向链表类似LRU的方法做,hashmap不计数,只用来更新每个char最后的位置,更新时把结点拉到LRU的tail并删除head。
2. 一个list, 含有k个数,然后给N, 让等概率的从1-N里选出不在list里的数。 这题一下子问懵了,纠结半天怎么算那个等概率。

 




第三轮:. visit 1point3acres.com for more.
午饭后整个人都不在状态,来了一道看起来很简单的数组查询题,就是一个sorted array,若干位置是空的,给一个target求第一个比target小的position. LZ直接开写 binary search, 结果发现坑挺多,遇到空位置移动指针的时候怎么都有bug, 最终还是没能写出能work的代码,这题看着简单写起来不容易,也许上来应该先写个O(N)的理一下思路。这一轮一定被给了低分。


第四轮:
多叉树序列化反序列化,写的磕磕绊绊。。

 

等结果太焦虑发个面经吧。。虽然之前花了基本一周的时间刷近期面经,但除了俩lc原题外一题面经都没考到。的确刷G的面经回报率太低,还不如把刷过的lc多夯实总结更有效。所以接下来的你们就凑活着看吧……

 

第一轮:超级nice的国人姐姐。因为到的比较早,先去kitchen拿了点零食然后闲聊了半天G家的室内装潢(……)和简历上的经历。题目是给一个positive integer N,求N最少能由几个2^i组成。比如N=1的时候,1=2^0,那么N最少能被1个2^0组成。再比如N=7的时候,7=4+2+1=2^2+2^1+2^0,这个case中N最少被3个2^i组成。然后follow up是,可以同时使用正或负的2^i。同样的例子N=7,在这个情况下,7=8-1=2^3-2^0,这样最少只需要2个2^i就能组成N。

 

第二轮:台湾葛格,人也挺nice的。没有废话直接上题,就是lc的bomb enemy,不同的是bomb也能放在enemy所在的位置。第二题是给一个iterator: 2,3,1,5,1,8… 要求写一个iterator要能return 3,3,5,8… 

 

第三轮:印度姐,

游客,本帖隐藏的内容需要积分高于 188 才可浏览,您当前积分为 0。 查看如何攒积分

. 1point 3acres 璁哄潧

第四轮:白人小哥,看起来就智商很高的那种。题目是给一瓶药,里面100颗完整的药片,每天需要吃半颗。每天吃的方法是随机从瓶子里取一颗药,如果是整颗就吃半颗,剩下半颗扔回瓶子里;如果取出的是半颗,那就直接吃掉。第一小问是simulate这个过程,然后print每天瓶中剩下的整颗和半颗的数量,直到空瓶。第二问是,求整个simulation过程中,瓶中剩下1整颗,0半颗的概率。最后问了running time。

 

除了印度姐姐全程冷漠脸以外其他面试官都很热情友好,交流得也很顺畅……一天下来感觉面试总体难度还行,并没有某些面经那么难(面之前看别人的面经真是吓得不轻……) 接下来默默等结果吧,也希望大家都能遇到原题,拿到心仪的offer!加油!!

 

9月初内推,9/15 做的OA,题目和之前地里说的完全不一样,90min两道题,当时拿到就慌了,感觉自己要做炮灰了。。。

第一道题是关于最近时间的问题,当前显示时间为 ab:cd,求下一个离当前时间最近的时间,并且只能用{a,b,c,d}这个集合里面的数字,数字可以重复使用,不一定要全部用到。输入输出都是字符串。
举个栗子: .1point3acres缃
当前时间为“23:02”,下一个最近的时间为“23:03”
当前时间为“23:58”,下一个最近的时间为“22:55” (第二天的)
我用的方法很蠢,就是找出所有可能的组合,去掉那些不合法的(比如42:23这种),然后求出和当前时间的时间差,取最小的。

class Solution {

public:

    string nextClosestTime(string time) {

        vector<int> d = {

            time[0] - '0', time[1] - '0', time[3] - '0', time[4] - '0' };

        

        int h = d[0] * 10 + d[1];

        int m = d[2] * 10 + d[3];

        vector<int> curr(4, 0);

        int now = toTime(h, m);

        int best = now;

        

        dfs(0, d, curr, now, best);

        char buff[5];

        sprintf(buff, "%02d:%02d", best / 60, best % 60);

        return string(buff);

    }

private:

    void dfs(int dep, const vector<int>& digits, vector<int>& curr, int time, int& best) {

        if (dep == 4) {

            int curr_h = curr[0] * 10 + curr[1];

            int curr_m = curr[2] * 10 + curr[3];

            if (curr_h > 23 || curr_m > 59) return;

            int curr_time = toTime(curr_h, curr_m);

            if (timeDiff(time, curr_time) < timeDiff(time, best))

                best = curr_time;

            return;

        }            

        

        for (int digit : digits) {

            curr[dep] = digit;

            dfs(dep + 1, digits, curr, time, best);

        }        

    }

    

    int toTime(int h, int m) {

        return h * 60 + m;

    }

    

    int timeDiff(int t1, int t2) {

        if (t1 == t2) return INT_MAX;

        return ((t2 - t1) + 24 * 60) % (24 * 60);

    }

};

第二道题是,花园里面种了一排花,每一天都会开一盆花,输入是一个array,a表示第i盆花在几天开。求第一次出现连续k盆花都没有开的情况时的天数。
举个栗子:
input
:[14253],2
output
2
+表示开花,-表示没开花
第一天:+----
第二天:+-+--(出现连续2盆花没开的情况,返回). Waral 鍗氬鏈夋洿澶氭枃绔,
我用一个arrayinterval,然后每开一盆花的时候,就在array中找到对应的interval,把它分成两个interval,并判断分完以后是否满足k的条件。
由于时间原因没有debug完。。。当时做完内心是奔溃的。

利用set以及iterator的特性;

 

第一题是,给一个string,形式"HH:MM",比如"15:43"。要求返回:利用出现的数字(可以重复,可以不用)组成的时间中,最接近input的下一个时刻,比如之前的例子,就是"15:44"。如果input是"23:59"就返回"22:22"。没有时间空间要求。

第二题有点烦,有一个长度为N的花坛,每天开exactly一朵花,给定一个1-N的permutation,代表每天开花的位置。假设某一个时刻,i和j位置的花开了,且i和j之间没有别的花开,那么中间就有一个长度为j-i-1的empty slot(最左的花就考虑和花坛左端的empty slot,最右的考虑和花坛右端的empty slot)。给定permutation P和一个指定empty slot size K,返回最早是哪一天,花坛中出现了大小为K的empty slot,如果始终没有出现,返回-1。要求O(N)空间,O(NlogN)时间。

 

* points insider a triangle
    * http://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/
* 第一轮
    * leetcode 163 missing range .鏈枃鍘熷垱鑷1point3acres璁哄潧
    * leetcode 269 Alien Dictionary.1point3acres缃
* 第二轮. more.
    * java gc
    * 抽象类和接口的区别,很多细节
    * unit test时好时坏怎么办,看随机数,Date, 多线程
    * ✓ leetcode 238 Product of Array Except Self
* 第三轮
    * 烙印让设计一个订票系统,各种表,不过感觉烙印有点弱,也不太懂,开始说不管性能,最后剩5分钟开始问性能,几乎要重新设计,轻度被黑
* 第四轮
    * 跑得快,手上一堆整数,能不能全部分成顺子,顺子是3个以上连续数 (LC 659,split array into consecutive subsequences, using the unordered_map<int,priority_queue<int,vector<int>,greater<int>>>backs.
* 第五轮
    * 200k个字符串,找到最小的会文字串,还要同时包含所有的字母(字母集合可能不止512)

* 第一轮
    * 两个string,char一对一match。比如(“banana”和“cololo”),follow up:如果有一个String[]对一个String,同样的match判断,要求输出所有match的string
* 第二轮
    * 1、有一个无限长的double linked list,和一个pointer array,每个pointer指向list中的一个node,求有多少个不相连的node group。
    * 2、二维平面上给一个矩形(和坐标轴平行),在矩形中给一个unified random的点。

The most straightforward way to handle this is through rejection sampling:

http://en.wikipedia.org/wiki/Rejection_sampling

// Given dimensions of the rectangle A, B where A <= B

boolean flag = true

while (flag) do:

  double a = NextRandomDouble(0,B)

  double b = NextRandomDouble(0,B)

  if (a <= A)

    return(a, b)

  else

    next

You essentially generate uniform numbers from a square that fits the original rectangle (of length B, in this example). If the number falls in the rectangle, keep the pair. If it does not, throw it away and try again!
    * 3、有一个touch screen的键盘layout,给一个test用的string array,要求return一个map,每一个test string对应一个result string。result string是手指在layout上按顺序划过的characters。
    * 4、给一个string pair list,两个query string,根据string pair list判断两个query string是否match。

方法一,建立一个图,利用DFS 搜索就可以了。方法二:就是利用UNION FIND.
    * 5、给一个二维grid,从(0,0)到(n,0),只允许右,右上,右下,有几种走法。

* 第一轮
    * ✓1.1 问一个数组里面最长的连续的递增数列的长度
    * 1.2 如果是一个tree,不一定是binary tree,的最长的连续递增的序列的长度, 这一问我是用recursive dfs做的,然后被要求用iterative 做一下。
* 第二轮
    * ✓求两个整数的二进制有多少个不同的位数
* 第三轮.鐣欏璁哄潧-涓€浜-涓夊垎鍦
    * ✓问一个数组能否只改变一个数字,从而让他变成单调增的数组。, 比如[3,3,2,2] 不可以,[1,2,5,3,3] 可以把5变成2或者3,可以。
* 第四轮
    * guess number,好像是以前的题?我没做过,还好跟leetcode上那个predict winner(或之类名字)的题很相似。
    * 给定一个范围,我要猜一个这个范围内的数字,每猜一个数,我要支付这个数字相同的钱,每次我猜之后,他的回答是大了,或者小了。问最后我最少付多少钱可以一定猜到这个数

参考LC375,Guess Number Higher or Lower II,属于最大最小问题。DFS+memorization/DP

int dfs(int start,int end,vector<vector<int>> dp)

    {    

        if(start>=end) return 0;

        if(dp[start][end]!=0) return dp[start][end];

        int res = INT_MAX;

        for(int i = start;i<=end;i++)

        {

            int local = i+max(dfs(start,i-1,dp),dfs(i+1,end,dp));

            res = min(res,local);

        }

        dp[start][end] = res;

        return res;    

    }


    * 我设了一个dp 2D array,然后跟leetcode 做法predict winner相似。总而言之是我和他都要取对自己最有利的下一步。
* 第五轮. 1point3acres.com/bbs
    * ✓给定一个函数f(x),由一段单调增一段单调减构成,比如抛物线。给定单调增的x的数组输入,要求输出单调增的y。
        * 大概做法是从两端开始考虑,结果数组里填f(x),要注意区分抛物线(比如)开口向上向下的情况。期间还指导了我如何写出漂亮的程序结构,比如loop里少用些if条件。. 1point 3acres 璁哄潧

* 第一轮 电面. 鍥磋鎴戜滑@1point 3 acres
    * ✓要求实现一个计时的 map 和其两个功能,set和get:
        * set(key, val, time)插入val和time for key
        * get(key,time) return val if not found return None
        * 每个key可以有好几个val和time。我选了dict来实现。因为我用的python,用了defaultdict(list),面试官一开始没反应过来tricky部分是,set调用多次,不一定time递增调用,然后get,如果time=1,3,4 for key1, get(key1, 2), 要求返回time=1的val。我一开始忽略了,结果直接返回none,因为2不在1,3,4里面。。。面试官(安慰我?)说好多人也犯过这个错误。连连道歉然后猛改。。。越改越紧张,磕磕绊绊。问get的复杂度,O(N)。面试官全程很nice很照顾,就是自己太紧张了!!!
        * follow up如何优化get,我说keep a sorted list based on time,这样get是logN,不过set也是logN了。

* 第一轮 电面.1point3acres缃
    * 第一个是一个美国大叔,做infrastructure的,聊了一会儿我的背景和做过的项目。warm up 问了一些算法的时间复杂度,
    * 技术题问了 wildcard matching... follow up 让给手动过了几个例子。然后完了还有十几分钟,又聊了一会儿google cloud。
* 第二轮电面
    * 第二个是一个国人或者(ABC)小哥,一开始聊背景,做的research,然后问了 full binary tree (每个node 要么有两个child要么没有)的问题,求给定leaf node数量,生成所有可能的树的结构。做完还有点时间,他介绍了一下他intern 和 fulltime的经历,他对google 的看法 . [Jeff, 可以使用DFS解决问题]                           

.鐣欏璁哄潧-涓€浜-涓夊垎鍦

* 第一轮
    * system design,设计一个ticket system,其实就是一堆client都request一个number,traffic巨大,要求所有client request的ticket要基本sequential
* 第二轮. 1point 3acres 璁哄潧
    * coding,给一个function D(), 假设这个function运行时间不一定,有时候很长,有时候很短,写一个wrapper function,里面是不停的call这个D(),要保证这个wrapper function运行时间是一定的, 第二题不记得了. 鍥磋鎴戜滑@1point 3 acres
* 第三轮
    * 聊很多很多的网络知识,聊项目. from: 1point3acres.com/bbs
* 第四轮
    * leetcode 394 Decode String [Jeff, stack solution]-google 1point3acres
* 第五轮
    * leetcode 301 Remove Invalid Parentheses (BFS)


* 第一轮
    * 分享一个Google onsite趣味题,面的其它题目比较常规,就不赘述了。趣味题如下:有一道密码门,设有二进制密码,事先不知道密码,也不知道密码有多少位。密码输入只有0和1两个按钮。系统内部设有一个buffer会存储输入,当输入达到和密码相同的位数时,系统会比较输入和密码是否匹配,如果匹配,则门开;否则没有任何反应,并清空buffer。问如何试出密码?
              DFS                                                                                                                                                                         

 


* 第一轮.
    * 给了一个迷宫,类似于一个二维矩阵,让用一个data structure表示这个迷宫,我用了一个vector<vector<set<char> > >, 其中set<char>里存四个方向,比如(0, 0)点右边是一堵墙,那么(0, 0)里面只需要存 'D',因为只有向下的方向可以走,版上的大牛也许会有更好的方法,然后给定一个start point和end point,找出从start point到end point的一条路径。
* 第二轮
    * 出的题是link list的变种,skip list,反正我是没听过,让我写这个skip list的struct结构,然后给定一个target value,让在skip list里找这个target value,要用到skip list的一些特性,类似于二分查找
* 第三轮
    * 给一个多叉树,让遍历这个树,然后的follow up是假设这个多叉树被corrupt了,给出一个set存了树里所有节点,让找出根节点。
* 第四轮
    * 给一个数组,每个element可以最多backward移动k个位置,但forward可以移动任意个位置,让尽可能的将这个数组排序,在时间复杂度上讨论了很久,从最初的n^2算法,到k*n算法,最后改进到logk*n算法.
* 第五轮
    * 问了挺多security相关的问题,因为和我的背景match,他本身也是security组的,最后让实现一个调用hash function的函数。.

* 第一轮 电面. more.
    * leetcode 297. Serialize and Deserialize Binary Tree.


* 第一轮
    * nextpermutation 这么简单的题楼主也吭哧半天,水平太差了。最后还剩十几分钟面试官MM居然说因为本人答得快,开始聊项目。多谢高抬贵手.鏈枃鍘熷垱鑷1point3acres璁哄潧
* 第二轮
    * find k-th largest element from a max-heap  (push, pop 操作,保证大小为K) 
    * leetcode 128. Longest Consecutive Sequence
* 第三轮
    * sqrt(n) , 然后引申出去考基础知识,hashmap 如何以最优空间存这个结果, search tree怎么存最优空间, 从f(n)反向求n需要什么条件,等等
* 第四轮
    * 设计一个订票中分配座位系统,方方面面讨论的比较多
* 第五轮
    * 专业知识比较水,面试官完全不是我这个方向的,以我讲为主


* 第一轮
    * leetcode 66 Plus One
    * union find

* 第一轮. 1point 3acres 璁哄潧
    * 如果給定一串小寫的英文字串,那麼按照字典順序,最小的下一個字串是什麼呢
        * 只要把給定的字串尾巴補個 char  'a' 就好。
. visit 1point3acres.com for more.
* 第一轮 2轮coding 3轮general SE
    * finding longest prefix
    * giving a set of points, find all rectangles. 看到这题有点闷,一直在纠结最优解,觉得用对角线中点外加斜边长度外加x或y应该可行,但是脑子僵了卡了半天。面试官很nice,说要不用暴力解吧,我想了下说,暴力解要O(N^4),而且觉得代码量也蛮长,就不大想写。最后纠结半天,说了暴力解的思路。在最后几分钟,感觉对角线解也想出来了,跟面试过说了下,他说that might work,就走了。
    *  friends of friends 外加一些计算机基础知识 (Union find)
    * Use one-dimension bitarray to mimic a two-dimension bit matrix,支持set, get某一个点设成0或1. follow-up是在这个matrix上画横线,竖线。 再follow up是画斜线。。当场我就投降了说,不是graphics major。不会。
    * minimum substring that contains the given characters ,秒了,刚想写代码。大哥说,你做过吗?我说没啊。他说,我觉得你idea对的,咱换个题。。我。。后来换成不给string, 给一个string iterator,用HasNext和next接口

LC 77 Minimum Window Substring

* 第一轮-google 1point3acres
    * leetcode 151 Reverse Words in a String
    * 类似decode ways的题目。不过题目背景是摩斯编码,要求输出所有可能的解码方式,而不单单是数目。用了类似decode ways的DP解法,只不过数组里存的是a list of decode strings
*  第二轮
    * leetcode 288 Unique Word Abbreviation的题。Follow up是如果要提供一个web service, 给一个很大的dictionary,用户提交Unique Word Abbreviation的查询请求,返回Word Abbreviation是否在字典里出现过,问怎么设计。楼主一开始给了个很naive的解法,就是单纯地把字典分成几份,分给几台机器,每次请求都问每台机器,然后merge results。面试官表示不满意,问我有没有可能每次请求只要访问一台机器。我想了想,提出先sort字典,然后记住每台机器的range,每次来请求先看这个word在哪个range范围,就问哪台机器。面试官还是不满意,说sort太费劲,提示我用hashing。然后我就给出了把Abbreviation encode成数字,在模n的结k果来选择机器。面试官说这个解法可以,就开始聊天了。

 

unordered_map<string,set<string>>mp;
* 第一轮. 1point3acres.com/bbs
    * 输入一个二维的char[][] board, 里面的元素只能是black,white和empty,
    * 输出个是boolean, 问是否有黑棋被白棋围死(只要有一个就行), 棋盘的四周默认是white.

* 第一轮.
    * 国人小哥,第一题166. Fraction to Recurring Decimal,问了为什么一定会循环,要求证明,然后说复杂度。第二题给一个网格每个点一个数,求从左上到右下最大乘,每次只能向右或者向下。这题跟加法唯一区别是要记录最小的负数是多少。然后问了一堆multithread的问题。
* 第二轮. 鐗
    * merge interval
    * best time stock1
    * 第三题dp,化简完了是斐波那契额数列,然后码完followup问能更快么,我就给了她一个logn的

* 第一轮. 1point3acres.com/bbs
    * longest Palindrome Substring
    *  直方图最大长方形
    * 分析correctness 和 时间空间复杂度。
. From 1point 3acres bbs
* 第一轮
    * 给定数组A,求数组B,满足b = A所有元素相乘除了a,不让使用乘法,问怎么办
* 第二轮
    * 给定数组A,和k,求数组B,满足b=a*a[i+1]*...*a[i+k-1],同样不让使用除法。. 1point 3acres 璁哄潧
    * 不知道这个是原题不,反正我也没见过。。。按部就班想,开始暴力算法,O(n*k),他问能不能优化,卡了,想了一阵,好像O(nlogk)?他也啥话没说,然后我慢慢,卡卡的写完了代码,后面还发现了bug,写的不很顺。
    * 具体想法就是,按照二进制进行优化,如果K=3=0b(11),那么创造两个数组A1=[A,B,C,D,E,F,G], A2 = [AB, BC, CD, DE, EF, FG],组合产生[A*BC, B*CD, C*DE, E*FG]

* 第一轮.
    * (问答题)一个有1000个word的list,sorted好了, 现在给你一个word,查找出来这个word是否在这个list里面,问这是什么算法,要找到需要找多少次,如果是100000个的话需要找多少次
    * (问答题)heap和stack memory的区别
    * (问答题)如果有个file很大,内存装不满,需要remove文件里面的duplicates并且sort,问怎么做
    * (问答题)python里面try catch 怎么样才能够执行本来会被skip的execution
    * (代码题)leetcode 110, balanced binary tree
    * (代码题)leetcode 20 valid parentness
 
* 第一轮. From 1point 3acres bbs
    * 题目是实现Tab功能,用户输入一个命令的前面部分,按下tab之后,提示用户所有可能的match。直接用trie实现,唯一难点是trie的遍历,要找出所有可能的match

. From 1point 3acres bbs
* 第一轮
    * 309 digits,相当于 2^1024
    * The fuel control mechanisms have three operations:
        * 1) Add one fuel pellet
        * 2) Remove one fuel pellet. 1point 3acres 璁哄潧
        * 3) Divide the entire group of fuel pellets by 2 (due to the destructive energy released when a quantum antimatter pellet is cut in half, the safety controls will only allow this to happen if there is an even number of pellets)
    * Write a function called answer(n) which takes a positive integer as a string and returns the minimum number of operations needed to transform the number of pellets to 1. The fuel intake control panel can only display a number up to 309 digits long, so there won't ever be more pellets than you can express in that many digits..
    * answer(4) returns 2: 4 -> 2 -> 1
    * answer(15) returns 5: 15 -> 16 -> 8 -> 4 -> 2 -> 1

* 第一轮
    * 给一个fair coin,对任意正整数n,如何模拟出1/n的概率。follow up:简要证明,然后写这个程序。.1蓄水池采样,

* 第一轮
    * 给一个2D的grid, grid上面每一个element是一个character. 然后给一个input的单词,找出在这个2维grid里面所有可能match这个单词的path的集合.鏈枃鍘熷垱鑷1point3acres璁哄潧
    * input: 2D grid, string word
    * output: 所有单词的path的集合
    * 问复杂度,我一开始有点蒙,跟他说我想一下,他说好的你慢慢想,也没有一直问我跟我说话. 假设二维数组一共有A个element,单词长度是B, 我一开始觉得是O(A^B), 后来又好好想了想,写出来应该是 O(4*3^(B-1)*A),他很惊讶,说我说的是对的,他要是自己想的话,会直接说O(4^B*A), 然后我笑了笑说仔细想想是有个小trick在里面的,不过我们讨论的很开心!


* 第一轮.
    * Presentation of my phd research
    * Basic probability, basic algorithm
    * flip a string.. 实现很简单,然后讨论了好一会哪个方案好; 还考了一些C++基础
* 第二轮
    * 比如问stack,queue的内部实现有什么区别,tuple和list有啥区别
    * 问的全是ML问题,linear regression,unsupervised learning什么的
    * 考的是flip a number, e.g. 2345 -> 5432。有一些edge case要考虑。我先在白板上给她比划分析,她说她要我写code,好像怕我用比划比划混过关一样。2分钟内写完code基本满意。她问我time complexity, 我说O(logn), 她仔细确认了我的答案,我说O(logn). 她说是O(k), k 是digit数字。我说没错,两个答案都对嘛。她说怎么可能是O(logn), 1, 34, 9345, 这难道都是logn?心中万千马飞过,再多解释了几句,最后居然没有达成共识。

* 第一轮
    * DP, 第一题类似paint fence,第二题是一个小升级
* 第二轮. more.
    * 第一题简单binary search, 第二题简单DFS
* 第三轮
    * 实现多项式乘法,自定义data class.鏈枃鍘熷垱鑷1point3acres璁哄潧
    * 主要用dictionary.
* 第四轮
    * BFS,leetcode上最新的几题之一。第一次碰到原题感觉像作弊,虽然第一次见该题的时候也很快想到做法,但是做过了还是可以更好的和reviewer讨论,而且白板上的code简直像抄的,基本没涂改
    * 面之前和reviewer 去cafe 吃了点东西聊聊天,聊到我想做ML相关的。回来面了个open question, anomaly detection,讨论了可行方法,最后写了pseudo code


* 第一轮
    *  merge 2 strings, make result smalest
* 第二轮
    * multi-threading to calculate Pi
* 第三轮
    * 聊了一下research,因为背景和reviewer有一点类似。问题是8-queen verifier.
* 第四轮
    * 小manager:计算飞机上能看到最远的地方有多远; shuffle words in a string.
* 第五轮 鏉ユ簮涓€浜.涓夊垎鍦拌鍧.
    * 大manager:中国人,中英穿插着闲聊

* 第一轮. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴
    * warm up.非常简单,找出unsorted数组中的第一个duplicate number. HashSet 或Map 的解法就行。
* 第二轮
    * Validate 一个二维整数矩阵n * n 从top left to bottom right, 是否斜着的每一条line上数字都相等。比如下面的矩阵,就是一个valid矩阵-google 1point3acres
1 2 3 4
5 1 2 3
6 5 1 2
7 6 5 1
    * Follow up 1, 如果矩阵很大不能完整读到memory中,但是可以读至少一行怎么办?
    * Follow up 2, 如果连一整行都读不到memory中怎么办,只能partially的读入一行的一部分怎么办?

* 第三轮
    * 给一个blacklist 含有一些整数[0, N) 中,写一个function 返回 [0, N)的随机数,但是不要返回任何包含在blacklist的数,要求uniform distribution, 且尽可能减少call 系统Math.random() 的次数。


* 第一轮. 1point 3acres 璁哄潧
    * 记电话号码
You are given a String numbercontaining the digits of a phone number (the number of digits, n, can be anypositive integer) . To help you memorize the number, you want to divide it intogroups of contiguous digits. Each group must contain exactly 2 or 3 digits.There are three kinds of groups:. 1point3acres.com/bbs
• Excellent: A group that containsonly the same digits. For example, 000 or 77.
• Good: A group of 3 digits, 2 ofwhich are the same. For example, 030, 229 or 166.
• Usual: A group in which all thedigits are distinct. For example, 123 or 90.
The quality of a group assignment isdefined as
2 × (number of excellent groups) +(number of good groups)
Divide the number into groups suchthat the quality is maximized. Design an
efficient algorithm to return thesolution that maximizes the quality
感觉上是用  DP,  但是想不出关系式。 从  j-1 到 j  要看前面好几个数字的关系
.鐣欏璁哄潧-涓€浜-涓夊垎鍦
* 第一轮
    * 写2D点的k-means clustering。这个比较小众,大概是他们组工作有用也跟我research相关
* 第二轮
    * LeetCode number of islands II. Follow up: operation 是把1变成0,count the number of islands. 还是用union-find,找相邻1的root.
* 第三轮
    * 一些stream和排列组合的题. from: 1point3acres.com/bbs
* 第四轮
    * 版上经典的flower题,借用个链接吧http://www.1point3acres.com/bbs/thread-159651-1-1.html
    * 这个答得非常不好,基本只写了brute force加一点优化。当时没怎么看面经,没想到其实也是DP,只是要update之前的cell
* 第五轮
    * 国人mm,判断4个点能否组成正方形。
总结:面完之后觉得下午面得很不好,很幸运还是拿到了offer。感觉不单是要把题做出来,做题时的交流也很影响interview的打分。一定要把自己的思路说出来,哪怕是在尝试阶段的思路,也可以展示思考的过程。如果实在来不及了,也要把brute force的code写出来,再优化,code都是要拍照的。


* 第一轮
* moving window average for double value。楼主用了类似LRU的double linkedlist 和 sum 解的, 但是感觉这个应该不是最好的办法。
    * follow up 1) 如果input data stream非常大的话会不会有error
    * linkedlist会有会有经常delete/create node,有没有什么改进。

* 第一轮
    * 实现java的garbage collector-google 1point3acres
    * 你需要不断的跟面试官交流以缩小问题范围。最后实质上是实现一个双链表结构,当你删除链表上一个node的时候,这个node要保存到另外一个deleted链表里面。如果你访问的node在deleted链表里面,你要把它捞回原来的链表。另外,面试官全程低气压,面试的时候让我感觉很不爽。但事后想想可能低气压也不是坏事,至少比笑面虎强。关键是不要让面试官的behavior影响到自己的发挥,保持冷静。

* 第一轮
    * Fill  screen with a string, 能fill多少次
    * 一个原题是在vertical和horizontal分别有序的matrix里找一个数,最优O(n).
    * find first duplicate of an array
    * Find minimum number of edits to make a string palindrome (应该已经出现过很多次了吧)
    * when the passroad is totally wet with rain drops.. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
. 鍥磋鎴戜滑@1point 3 acres

其实算法题就只是三种:数学归纳法,tree, graph。他就是出Word Ladder II的那个人啦。要是谁有兴趣,请回复


* 第一轮
    * 电话面试,问的是简单的图算法。感觉自己stuck了就问点tip,不慌就能写出来了。
    * 另外一点体会是用google docs最好提前自己进去设置舒服的字体,页面orientation设置为横向。arial 或times new roman字体写代码丑爆了,换个喜欢的字体吧
    * 问: 给个directory,找出其下面所有的java文件。写代码
    * recursive function,很简单
    * 问: 如果肉眼看java代码,class之间的引用关系怎么找?
    * 看reference的type;new operator之后跟来的class name。 或者分析用reflection写的object construction代码。
    * 问:假设已经有了getClassDependency(A) api,作用是返回A class所依赖的其他类。现在有一个硕大的代码库,其中有些java class早已没人用。怎么找出所有此类class?
    * 图算法。把代码库看成图,每个class是节点,依赖关系是边。从有用的class开始遍历图,并标记已访问的节点。最终没有被标记的节点是不可达的,即为没用的class。类似JVM的垃圾回收。. visit 1point3acres.com for more.
    * 问:你说的算法是不是还有missing part?
    * 缺了找有用的class的api
    * 问:那什么样的class是有用的? give some example?. more info on 1point3acres.com
    * 包含main method的,或者框架类的subclass,例如jsp的servlet。
    * 问:假设已经有了api获取这些有用的class,实现上述的算法。
    * 图遍历。只要注意标记过的节点不重复访问就好(可能有环)。其他没啥难点。. from: 1point3acres.com/bbs

鏉ユ簮涓€浜.涓夊垎鍦拌鍧.
* 第一轮 电面
    * 首先给一个字典,比如:{apple, people,...}
    * 再给一个misspelling word,比如:adple,返回它的正确拼写,即 apple
    * 还知道一个限制条件,misspelling word只跟原单词有一个字母的区别。如果输入是addle,返回null。如果字数不同,也返回null
    * 还是比较简单的一个题,一开始以为是warm up。结果发现这种简单题也是能扯出很多东西的,主要在问题的理解和交流上。比如:是不是需要返回所有的correction,如何降低一些时间复杂度。写完代码,又问了下我怎么测试。一共用了30分钟在这道题上。剩下的15分钟就是聊我过去的项目和她现在的team。45分钟准时挂电话。(利用TRIE来计算)


* 第一轮. From 1point 3acres bbs
    * Leetcode的Buy Stock的1和2. 1point 3acres 璁哄潧
. Waral 鍗氬鏈夋洿澶氭枃绔,
.鏈枃鍘熷垱鑷1point3acres璁哄潧
* 第一轮. 涓€浜-涓夊垎-鍦帮紝鐙鍙戝竷
    * 第一题是random generator的题,比如给100*100的matrix,初始为全零,让随机把其中p(比如百分之六十)的值设为1
    * 第二题是tree level order traversal,按层输出,只用打印出来就可以了

* 第一轮-google 1point3acres
    * 第一个问题OOD看代码给输出,代码贴在DOC上了,楼主从来没复习过OOD,直接说不会,她说OK, let‘s move on
    * 第二题,一个数组长度为n+1: 1 2 3 4 .... m, m, m+1, m+2, ......n注意每个数都在[1 - n], 已排序,求出现了两次的那个数,也就是m。直接二分,非常水。。。
    * 第三题,输出锯齿状数组,比如输入为1,2,3,4,5, 输出1,3,2,5,4。也就是下标奇数的大于它的前一个和后一个元素。楼主直接先排序再输出,复杂度lgn。面试官说能不能更优
    * 我说那直接扫一遍,遇到不满足条件的两两交换,就是线性复杂度。然后问了我为什么这么做是对的。然后时间到了,问了两个问题结束。
* 第二轮:
    * 全程就一道题。missing range。[0-99] 也就是(3,5,99)输出字符串“0-2,4,6-98”。又非常的水,写完了问复杂度,然后找corner case跑。然后可能他发现我定义了全局变量,就问我这个函数调用两次是不是输出都一样。我立马反应过来,我说不一样,然后改成局部变量就一样了。然后他问题能不能优化成亚线性时间。卧槽这怎么优化,我想了半天我说sorry我想不出来。他说那你是不是觉得这个问题不能优化。我说对我觉得线性时间已经是最优了,最后问我如何在多核上实现并行,这还不简单,直接把输入拆分了并行做然后合并边界。然后时间到了,问问题,结束。

* 第一轮
    * 两个数组A,B,找在B里不在A里的。第二题记不得了,汗
* 第二轮
    * 第一题无限长输入,统计win内的平均值,并问时间长了double精度drift怎么办(重新算); 第二题LRU设计和psuedocode。
* 第三轮
    * design, 本来要问LRU,发现问过了,就改问类似youtube的系统如何设计cache
* 第四轮. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
    * 第一题算x^y,第二题serialize/deserialize string
* 第五轮
    * 第一题若干人赛跑,已知是一个pair list, 譬如(1,4)表示1在4之前到达,求最后的排名,和scheduling一个意思吧;第二题是shuffle数组,问了些概率.鏈枃鍘熷垱鑷1point3acres璁哄潧
. 涓€浜-涓夊垎-鍦帮紝鐙鍙戝竷


* 第一轮
    * Longest Consecutive Sequence.. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴
    * Binary Tree Longest Consecutive Sequence 的变种,Tree Longest Consecutive Sequence,可以允许多孩子节点。

* 第一轮 鏉ユ簮涓€浜.涓夊垎鍦拌鍧.
    * 第一面: 给了一堆老鼠, 然后判断两只老鼠是不是有血缘的关系。类似Lowest Common Ancestor of a Binary Tree。但是有两个Parent。
    * 第二面:Game of Life, 问了些如何并行加速运算
    * 加面:
        * (1) Given two strings, check whether they are same ignoring the space
        * (2) Give N points (x, y), find the shortest loop: 用了最简单的生成所有排列,然后找出所有距离最小的。.1point3acres缃
        * (3) Give N sorted arrays, find the intersection of all arrays:每次取所有头部的最大值,然后检查是否在所有arrays中出现,如果是,就加到并集里。


* 第一轮.鏈枃鍘熷垱鑷1point3acres璁哄潧
    * H-Index
        * given an array, output a maximum k such that there are k elements larger than the value k
        * 面的时候,面试官和我说先来个简单的,结果就是这个题,我理解这个题就用了好一会儿,心想这怎么简单了。O(nlogn)的解法其实挺直接的,但是我觉得这个太简单了,G不可能,所有挣扎着想出了个O(n)的解法,就是用bucket sort的思路。

* 第一轮. 鍥磋鎴戜滑@1point 3 acres
    * 给定一个产生[0,1]直接随机数的函数,以及一个三角形。要求调用这个函数随机产生一个在三角形内的点
    * 给一个string,比如aababbc,然后对字母重新排序,使得相邻的字母都不相同,比如abcabab。
* 第二轮
    * 给出一些string,每一个都是一个不包含"/"的路径,比如“usrbinpython”,“usrbinperl”,“usrbinjava”,然后要求输出最有可能的路径,比如这个例子就应该输出"usrbin/java", "usrbin/p/ython", "usrbin/p/erl". 还有一些follow-up,比如怎样避免这个p被劈开,当输入数据很大的时候,怎样选最有可能的路径之类的。
    * 这题应该是用trie吧?我反正也是挣扎了很久,写了满满一大黑板,有时候改了后面还要改前面,然后面试官就一直跟着我拍照。
* 第三轮
    * 给一个linkedlist,然后给了一些node。要求输出有几个group,group的定义是连在一起的node就算一个group。比如linkedlist是这样的1->2->3->4->5->6->7->8->9, 然后给的弄得是[3,4,7,2,5], 那就输出2. 这题也是有很多优化和边角讨论

* 2D Segment Tree
    * 一个binary image的编码,问怎么样编码最好。答案是4-tree,就是每次把图片分成4块,如果每一块只有一种颜色,就用一个leaf表示,否则就继续四分下去
    * 题目就是,怎样把两棵这样的4-trees合并起来
    * 不相同为black

* .鏈枃鍘熷垱鑷1point3acres璁哄潧
* tree level order traversal.鐣欏璁哄潧-涓€浜-涓夊垎鍦
    * Time O(n), space O(n)
    * Time O(nlogn), space O(logn). 鍥磋鎴戜滑@1point 3 acres
    * 正常方法用queue写完后,要求用更少的space。我当时提出了用populating next right pointer的写法来写,这样时间是O(n), 空间是O(1).但是可能因为是电话,我解释的不好,面试官好像没听懂,他没接受这个解法。后来经过他的提示,要求我写的是时间O(nlogn),空间O(logn)的,就是给把tree多扫描几次,每次遇到需要打印的level就打印,不需要的就不打印。.鏈枃鍘熷垱鑷1point3acres璁哄潧

. From 1point 3acres bbs
* range search
    * binary search leftmost, right most
    * leetcode range search

* 可能最小的排序,每个数最多移动k步
    * 给一个string="bcdaea",和一个int k=2,输出最小的排列,每个字母只能换到距离k以内的地方
    * Given an array of n elements, where each element is at most k away from its target position, devise an algorithm that sorts in O(n log k) time.

Google Phone Screen 最新面经

  1. 面完一周还没消息催了下hr, 刚通知过了, 可以愉快的准备onsite了。分享下电面题。面试官是个berkeley 本科一路读到phd的黑哥们。

简化版有向图找环, 给一堆edges, 找到eg. 1->2 , 同时2->1的这种边的个数, 比如上面这个例子, 应该返回2。 秒答以后问了下复杂度。

有一个double类型的数组, 找满足 [a, a + 1) 的最长序列含有的元素的个数, eg. [ 1.0 ,1.3 ,1.5 ,2.3, 3.5],  最长的是[1.0 1.3 1.5], 应该返回3。这种小学5年级的数学(数组操作)题对我来说是很困难的, 我直接说暴力解法呗, 然后面试官提醒了下用greedy的方法。 然而代码还是写的很艰难。。。大家可以自己写写O(n)的方法练习一下。

http://www.1point3acres.com/bbs/thread-192426-1-1.html

  1. 刚面完,貌似是个欧洲小哥,上来hello完了以后就开始做题,两个题:

第一个 lc 54 spiral matrix 稍微改动了下成了x,y坐标的image上色, 

第二题 sorted list 2sum 楼主一看感觉这tm挽回颜面的时间到了!!!解释了下思路然后瞬间秒了,然后walk trough了一下test case。小哥就说没时间了,然后good luck。。 感觉好虚……第一题居然花了那么久,还是自己太不淡定了,现在只求2面。。bless me.... 大家面试的时候一定要静下心来,不要浮躁。。发挥出自己的正常水平基本就很稳了。祝大家找工顺利。。

http://www.1point3acres.com/bbs/thread-192578-1-1.html

  1. 第一次电面很紧张,是个小哥,人不冷不热。貌似是新题,题目很简单一个 binary watch,类似下图pastedGraphic.png

比如:

1000 > 8

 

000011 > 3

时间就是08:03.

让输出所有亮三个灯的时间。 刚开始感觉可以用backtracking来枚举情况,写了一会小哥不理解,然后提示用最naive的方式,写一个countones的函数,然后从 0000 -> 1111分别调用countones来枚举所有符合条件的情况。需要注意,小时必须小于12,分钟必须小于60. 做完有个小bug在提醒下改了,然后时间不多就问了几个问题。 请问电面是不是都是两道题,我只做了一道是不是没希望了. bless~

http://www.1point3acres.com/bbs/thread-192342-1-1.html

  1. 本来投的是EE方向,后来recruiter主动联系说你投的已经满了,想不想面SDE,我说当然好了,然后五月初写完了OA,题目很稳定,地里面两道题答案都有今天下午电面,面试官听口音应该是个美国本地大叔,声音很和蔼,是总部的site reliability engineer, 先跟我聊了下简历,然后就开始做题。

第一题:打印所有的质数(print all prime numbers),我已开始没理解清楚范围,设了个i<Integer.MAX_VALUE,为了第一题秒时间,我没多想就用了俩for loop写出来了,他说可以,这样能保证小范围的质数短时间打出来

第二题:follow up, what if keep printing to the number that greater than the biginteger by using java, 没想明白,我说java里面有biginteger的library,大于long的长度,他说这样用第一题的方法的话越到最后时间越长,两个数间隔好很久(假设n到正无穷..). From 1point 3acres bbs 因为是个O(N*N)的解法,有没有更好的解法,大叔很有耐心,一直在等我想,也给了些hint,我最后没想出来,后来时间到了,感觉药丸。

后来他推荐说经常上project euler上面刷刷题,我说好的,估计是暗示我刷的不够吧,本来专业就不一样,EE出身半路出家转CS,最后一学期发现EE工作很难找于是赚了CS,还是挺吃力的,anyway,先写出来给地里的兄弟姐妹们看看面经吧,攒个人品

http://www.1point3acres.com/bbs/thread-192458-1-1.html

  1. 直接上题

一开始问我用什么结构存这个grid, 我说vector,他问为什么,我说可以random access。

然后做题,先直接brute-force, 2问O(1), 3问O(n^2)。他说取最大值太慢了,我就用了个priority_queue(他还问了我priority_queue<int, vector, less>参数的意思,说他不太清楚。。),2问变O(n^2),3问变O(1)。他说不行,set value太慢了,我说创建一个vector maxVallue(m, 0),记录每行的最大值,这样2问复杂度是O(n), 3问是O(m)。

他又否了我的想法,说如果是一个1*1000的grid复杂度还是很高。我说binary search tree可以都O(logn),他说有duplicate怎么办,后来我说用multiset,这样都是O(logn)并且可以重复。

(PS: 因为太久没用multiset+时间太赶,用法写错了。。。multiset是不能改变值的,只能找到了然后删了再加新的,当时没时间了就跟set一样直接ms[grid[i][j]] = newValue了。。。应该是ms.erase(ms.find(grid[i][j])); ms.insert(newValue)。悲剧).

这一道题就把时间用光了,前前后后写了4种方法,最后那个也不知道达到他的要求没

这题是经典的operation tradeoff。

假设矩阵大小N*M,那么(至少)有如下做法:

    1. 维护一个正常的grid。set value O(1),取最大值O(NM),空间复杂度O(NM)。
    2. 二维线段树维护最大值。set value O(logNlogM),取最大值O(1),空间复杂度O(NM)。
    3. 自己建heap,然后建立一个从grid cell和heap index的双向映射,然后每次更新值的时候先从grid到heap的映射中找到heap对应的index,然后根据改大还是改小决定shift up或者shift down并且维护所有变更的index。set value O(log(NM)),取最大值O(1),空间复杂度O(NM)。
    4. 记录最大值和最大值坐标,每次修改到最大值所在坐标的时候更新最大值。set value 最好情况O(1),最差情况O(NM),取最大值O(1),空间复杂度O(NM)。

之后就是考虑如何tradeoff。如果set数量远远大于query数量,那么set的复杂度就要尽量低,于是方法1是最好的;如果query数量远远大于set数量,或者说set数量远远低于矩阵大小,那么方法4是最好的,因为最大值被修改的可能性不高;如果query和set数量基本相同,而且和矩阵大小是一个数量级,那么方法3应该是首选。如果这是一个实际问题,那么可能所有的情况都会出现,所以可以根据现在query和set的比例情况自适应的选择最好的处理方式。

http://www.1point3acres.com/bbs/thread-192195-1-1.html

  1. 上周GOOGLE 店面, 一个题 , 一直标准的系统函数read, 有一个功能 每次就读一个字节, 然后要经常读,在一个loop 里, 问如何优化。 结果就是一次点用read多读一些,放在缓存里,用没了再读。

http://www.1point3acres.com/bbs/thread-191880-1-1.html

  1. 给一堆nodes有,每个里面有 id,有parent_id

function 1 实现获取当某点的子节点

function 2 实现获取当某点的后代点

follow up:

先用O(n)做了,然后问如何做到O(1)

取后代的时候注意什么问题?

    1. 自己是自己的父节点
    2. nodes里面有环(如何防范?)

http://www.1point3acres.com/bbs/thread-192591-1-1.html

  1. Google 技术店面,4月份面的,楼主太懒,一直拖到现在。

听口音应该是白人小哥,上来寒暄一番,说说自己在google 做什么,然后问了些关于项目的东西,然后做题。

题目很简单,就是leetcode 346 题,moving average from datastreaming。但楼主做的时候这道题还没post 出来。目测只要将time complexity 降到O(1) 就行,楼主就是维护一个window size 大小的List,和一个window size 内所有数的和。但要注意corner case。

还有两个简单的follow up,如果是多线程怎么办,以及写一下test case。下周onsite,攒一下RP。祝各位找工作顺利。

链接: https://instant.1point3acres.com/thread/178618 来源: 一亩三分地

  1. 美国小哥。上来先问我自我介绍和最challenge的project。聊了大概七八分钟, 然后上题。很简单。
    1. 给一个字符串里面只包含0-9的数字和*,*可以被0或者1代替,求出input字符串中的*代替成0或者1的所有结果。100*11 结果是 100011,100111
    2. 一个整数一数组形势给出,给这个数作加1。 

链接: https://instant.1point3acres.com/thread/176414 来源: 一亩三分地

  1. 5/6 google 电面

首先给一个字典,比如:{apple, people,...} 再给一个misspelling word,比如:adple,返回它的正确拼写,即 apple 还知道一个限制条件,misspelling word只跟原单词有一个字母的区别**(且长度相同)**。如果输入是addle,返回null。如果字数不同,也返回null 还是比较简单的一个题,一开始以为是warm up。结果发现这种简单题也是能扯出很多东西的,主要在问题的理解和交流上。比如:是不是需要返回所有的correction,如何降低一些时间复杂度。

写完代码,又问了下我怎么测试。一共用了30分钟在这道题上。剩下的15分钟就是聊我过去的项目和她现在的team。45分钟准时挂电话。。 上周五电面,今天就给了onsite通知,还是很有效率的。 

链接: https://instant.1point3acres.com/thread/178030 来源: 一亩三分地

  1. 上周三面试的,今天接到电话说已经挂了。

Google的面试给我留下了很好的印象,因为做的比较规范,最后反馈也都是电话告知结果,非常正规的感觉。

我当时面试的时候运气不错,是一个美国小哥,题目也蛮简单的。第一题是给两个string,其中一个string比另外一个多了个字母,返回这个字母。 第一题就用了最简单的比较,比较每一个字母(按照顺序就可以了),注意一下边界条件,最后一个的边界条件。

Follow up是如果字母顺序打乱了怎么找。我先说了HashMap,要写的时候想起来另外一个方法,就是把所有的ASICII加起来,减一下,得到的就是多出来的那个。 我就直接说了这个,然后写了这个。写完之后小哥问了一下时间空间复杂度,然后说你已经把本来要提升的东西做了。

然后给了个第三题,是说如果说要实现一个数据结构,要有insert(), delete(),medium(),mode()方法,怎么写。 这题感觉是我最后被拒的原因,因为我感觉我没正确理解他的意思。因为这里你用LinkedList()也好,ArrayList()也好,总会有一个时间复杂度会很高,后面结束的时候想想可能是想让我比较每种结构的优缺点。 我当时是写了一个Arraylist的,他问如果找中位数怎么办,是不是会time complexity很高,然后我说每个结构都会有缺点,是个trade off。 最后时间也不够,因为是额外加的,草草结束了这题。 其实答完感觉还可以,不过最后还是挂了。

Move on了,不过HR还是很nice,今天电话告知我挂了之后问我要不要点学习资料,还发了学习资料,然后说8到12个月以后再见。 整体对google的招聘印象很好 

链接: https://instant.1point3acres.com/thread/175542 来源: 一亩三分地

  1. 第一轮,国人小哥。 给我一堆unsorted数字,问我可不可以等分成若干组,每组由五个连续的整数组成。

eg:

    • 1,2,3,4,5,4,5 -> false
    • 1,2,3,4,5,2,3,4,5,6 ->true

follow up: 问我可不可以等分成若干组,每组由五个重复数组成。

follow up 2: 每组由k个连续数组成。 k>=3

第二轮: 本地小哥 地里的encode decode aaaa->4xa

这里楼主作死了,我就说那 4xa 和aaaa 结果都是4xa 怎么区别? 对面蒙了,我也傻了,天哪就你嘴贱,我是在给自己出题吗?

果然对面就回了既然你这么diao,你来解决这个问题吧。。。。。。

楼主想了想:

    1. 全部做成 2x a的形式,但是在不重复字母多的时候perform很差
    2. 参照编译器用转义符, 变成2\xa, 如果是\输入就变成 \\

对方好像自己在嘟囔一些东西,说转义符是可以,但是会有问题,但是也觉得没啥其他办法。 跟amazon那哥们不一样,这个小哥很爱笑,楼主瞅准机会就是讲段子,然后黑c++。小哥听的很开心,好像不打算问我问题了,我就继续跟他吹谷歌多好,把谷歌三宝拿出来跪舔。 整套下来讲了快一个小时,都是吹水,第一次遇见这种面试,不知道好事坏事,不过我挺喜欢的,我也直接跟他说了这不像是面试,更像是捞家常。

国人小哥最后一题follow up 有点卡住,不够时间没写完,不知道会不会给同胞面子。第二轮这个我就不知道他会怎么报上去了,不过感觉交了个朋友,还是不错的。

链接: https://instant.1point3acres.com/thread/160931 来源: 一亩三分地

  1. 5月5号进行了Google的电话面试,是一个老印。题目简单到自己都无法相信,回报地里攒RP!

Leetcode的Buy Stock的1和2……速秒之…… 就一轮,今天收到onsite通知,希望onsite有好运 

链接: https://instant.1point3acres.com/thread/178142 来源: 一亩三分地

  1. 一个小时前的面经,就问了一个问题,回头想想很简单,不过答得不咋好。 :-( 面试官小哥特别好,很轻松,前面瞎扯扯,让我先问问题,说后面写算法的时候会耽误点时间,所以先问问题,(满善解人意的)。

废话不多说,上题:

Give you an array of integers: A

 

Goal is to find three indexes (i,j,k) such that A[i] + A[j] == A[k]

 

For Example:

A = [ -5, 10, 1, 8, -2 ]

 

10 + -2 == 8

 

Good answer: i=1, j=4, k=3

也不知道那时候脑子怎么抽了,一直在回想刷过的题目,搞复杂了,好可惜。

希望将来面试的人好好审题。 Good Luck Everyone!

http://www.1point3acres.com/bbs/thread-190302-1-1.html

  1. 美国小哥挺友好的,一直在肯定我说的话,题目不难,气氛还算不错,希望能顺利onsite。

第一题:给一个 sorted Integer array, 返回square后的array.主要是要考虑负数的情况,很多trick的地方比如全都是negative或者全都是positive

第二题: serialize a string array, then deserialize it. 祝大家猴年大吉!!加油加油!! 

链接: https://instant.1point3acres.com/thread/157007 来源: 一亩三分地

  1. 上周一(2/29/2016)的google电面,今天刚刚收到通过的通知电面通过,赶快过来发面经。

面我的是个白人小哥,人非常nice,只问了一个问题:moving window average for double value。楼主用了类似LRU的double linkedlist 和 sum 解的, 但是感觉这个应该不是最好的办法。 follow up 1) 如果input data stream非常大的话会不会有error 2) linkedlist会有会有经常delete/create node,有没有什么改进。 楼主从电面到收到通知之间用了一个星期,不知道是不是答得一般,committee意见有分歧。onsite求bless! 

不好意思,这个题没有说明白。 题目是有一个data stream, find the average of latest k numbers。 data 是 double parameter。这就类似于array 的moving window average 

链接: https://instant.1point3acres.com/thread/164302 来源: 一亩三分地

这两个follow up是根据我的回答问的。

    1. 我用了一个sum 来记录window值的总和, window 里每次加入/剔除一个树时就update一下sum,这样求average是O(1)的时间。但是如果data stream太大,每次求sum的error会累积,最后就不准确了。 我当时回答如果data stream太大就不用sum记录了,但是这样求average 就是O(k)。 现在想,其实可以每一定量数(e.g 1000)后refresh一下sum,这样还是可以keep O(1)in time 2)
    2. 这个面试小哥是想说每次create list node 和delete list node不太好,可以保持list node 不变,每次改node value 就可以了。

链接: https://instant.1point3acres.com/thread/164302 来源: 一亩三分地

  1. 分分钟刚面完。。赶紧写个面经赞一波人品。。 一个不知道是不是国人的女生声音挺甜的accent不太像local,如果是还求国人妹子给过啊。。

上来大概问了5分钟background然后直接上题,一个string decompression的题。。不知道是不是原题反正没见过。。题目如下.

2[abc]3[a]c => abcabcaaac;

 

2[ab3[d]]2[cc] => abdddabdddcc

      一开始用了一个栈,写着写着嵌套的逻辑卡住了,最后用俩stack解决。。

然后follow-up问的是不要输出string而是输出解压后的K-th character,主要也还是嵌套情况就从内到外把疙瘩解开以后再算。。然后我问俩问题就结束了。整体感觉妹子面试官人很nice 反应很快而且不是特别picky的那种。

 

 

求好运~,求onsite

 

[http://www.1point3acres.com/bbs/thread-189365-1-1.html](http://www.1point3acres.com/bbs/thread-189365-1-1.html)

  1. 打过来电话后人家先让我自我介绍一下,并且给她讲一个project,完后就是google doc做题。

我就只有一道题,是string decompression.

example

3[ab]2[abc]e ==> ababababcabce

3[2[de]f]==>  dedefdedefdedef

http://www.1point3acres.com/bbs/thread-189938-1-1.html

  1. 上次电面之后,Recruiter给我打电话说是“好消息”,然后给我加了一轮电面。(:з))

今天下午做的加面,面试官是个烙印。(:з)) 还是两个题:

    1. 大整数加法,追问如何用并行计算优化。我说按8位切片,在每个片里转成整数做加法,然后等更低位传过来进位。不过听烙印的反应似乎不太好。(:з))
    2. 一个整数数组,找sum最接近0的一对数。2Sum Closest Pair。 求onsite。(:з)) 烙印全程不怎么说话,搞得我心里很虚。是福不是祸,是祸躲不过。(:з))

补充内容 (2016-3-19 13:54): 3/16 接到onsite通知

链接: https://instant.1point3acres.com/thread/165509 来源: 一亩三分地

第一题 实际上你的并行策略并没起作用。如果有carry in 你的MSB得重新算。等于说整个MSB的计算都depend on LSB的计算的结果。 我觉得应该用个类似carry selection adder的方法。 suppose你分2个进程, 你的MSB要计算有carry in的, 也要计算没有carry in的 最后根据是有还是没有把预测错误的那个结果抛弃就行。 补充内容 (2016-3-15 13:43): suppose 你把整个数字断分成MSB和LSB。 你需要3*个进程

链接: https://instant.1point3acres.com/thread/165509 来源: 一亩三分地

同意LS,因为高位在等低位的carry,如果真的有carry还得再算一遍,既然这样不如在等的过程中算一遍没有carry的和carry是1的,最后选择对的一个。

链接: https://instant.1point3acres.com/thread/165509 来源: 一亩三分地

  1. 新鲜出炉的GG电面。面试官应该是美国大叔,面试两道题。

第一题Random Walk,因为不经常写random函数,网上查花了点时间。查到了以后分分钟搞定。

第二题Skyline类似的问题,似乎不是用的最优解法但是面试官还算满意。 后面聊了一些工作环境以及他们组的工作内容。今天下午面试的,希望能过! 

链接: https://instant.1point3acres.com/thread/154428 来源: 一亩三分地

  1. 动作比较晚,到寒假才开始找实习,结果Google差不多成了我的处女面,之前都没面试经验(我知道要先拿小公司试水,但小公司网投都没回音==!),所以没抱太大希望,权当积累经验了。

一面:国男-google

上来先谈简历,做过的一些项目,大概扯了十分钟左右。

然后做题:

encoder and decoder

 

Example: aaaabbbbcc5555->4xa4xbcc4x5->aaaabbbbcc5555

我直接用naive方法做了,Two Pointers。这个方法的局限是只能做连续字母个数小于10的那种,比如21a,decoder就不知道是21a还是21个a。 写程序后,让跑个test case,像debug一样一步步讲,途中问了一个pointer的问题。 然后让分析算法复杂度。

接着是一堆OOD的问题: 什么是virtual function,什么时候用? 什么时候用virtual deconstrutor ? 这些都在CC150中有。

最后还有时间,就让我提问,我就问了intern都干些什么,小公司还是大公司对个人发展更有帮助,还有就是对于interview有什么建议?.他最后说我除了边界条件没处理,其他都做的挺好的,他会给我good feedback。(这里真的很感谢这些前辈!!!给了我很大信心!)

二面:白男

上来直接问我做过的一个Android项目,问的挺细致的,让我讲扫描二维码登陆的具体实现原理。。。 然后做题:

A: 34567

B: 45678

C: 67345

交换A中的数字位置,得到一个新的数C,使得C大于B。

我的想法是,每次挑出最大的那个digit跟前面的swap,直到找大于B的,时间复杂度是O(n*n);corner case:当A、B的digits个数不等时,直接返回结果。

这时候小哥给了hint说这本质上是一个sort问题,那么sort问题你ideal复杂度应该是多少呢?sort我就直接想到了quicksort,我就说找最大digit的那个过程可以用quick select,这样就是O(nlogn)了。然后让用test case跑一边quick select,让分析复杂度。

Follow up: 存在很多这样的C,返回其中最小的那个。 因为要把integer的digits一个个拿出来,弄成array,比较麻烦,就只让讲了下想法,然后用test case跑一边. 最小的就是离B最近的那个,所以我的想法是,从B开始找。因为B中可能存在A没有digits,所以先作差集A-B={3},把B中的8替换成3,得到45673. 然后从B的尾巴开始,保持一个递减的序列B[i - 1] > B[i],直到碰到一个B[i - 1] < B[i], 则B[i - 1]跟B[i...n]中第一个比B[i - 1]大的那个交换,得到45763,然后使B[i...n]递增,得到45736。 感觉我是弄的太复杂,消耗了很多时间,最后小哥感觉不耐烦了,到了45分钟,就直接说了thanks for your time就挂了,我都还没缓过神了。

总体来说,一面encoder、deconder之前见过,但没有去实现,OOD问题CC150中见过;二面的题目没见过,所以感觉很虚。。。 Anyway,权当积累经验,攒RP了!

http://www.1point3acres.com/bbs/thread-166600-1-1.html

  1. 发个google 跪经, 一个三哥面的。感觉他人应该不错,有试着提示我,可是那英语好难理解呀。。。

好了,上题:

Find the total number of patterns of the Android lock screen. The number of key used has to be at least 4, and max 9.

Example:

If the keyboard is

 

| 1 | 2 | 3 |

| 4 | 5 | 6 |

| 7 | 8 | 9 |

 

use 5 keys:

 

OAB

OOC

OED

which means 2->3->6->9->8

 

OAB

OCD

OOE

which means 2->3->5->6->9

 

Same thing goes with 4, 6, 7, 8, 9 keys. Count the total possible pattern. The order of keys used matters.

看到这个题一点想法都没有。。。

http://www.1point3acres.com/bbs/thread-186774-1-1.html

  1. 两道题
  1. 24.1. maxDepth of a tree:recursion
  2. 25.
  3. 26.2. Design a interface for find the running mode in a stream of values: 随时返回most frequent word

先写函数

get();

add(String input); 

再问怎么实现这个两个函数:先说了Heap, get()--O(1),add()--O(n)

然后她说优化add(),我说用HashMap+ counter,这样get()-->O(1),add()--->O(1)   然后开始写代码。。   

写完了问你觉得这个代码有什么问题,我说multi-threading可能有错,一个在get(), 一个在add(),她说 是的,如果这是single thread

    • 我说可能space太大了,因为有些hot词频会被频繁输入,但是冷门的词语也会一直保存,她说对的 怎么优化?
    • 我说用Tritree,减少HashMap key的存放空间,她说这个key不一定是string,可能是object,
    • 我说group input searching,比如 google, google.inc 表示的可能是一样的意思,只用一个key保存,这样插入时判断similarity,小于一个threshold就认定match,把当前位置+1;    
    • 我说用cache。大概说了说,时间就到了,她说you are in the right track,但是我们没时间了。

http://www.1point3acres.com/bbs/thread-188200-1-1.html

  1. 一上来就直接贴题目做。面试官是个口音不重的印度小哥,不过给我的感觉他还比较nice。

让设计一个机器人,实现前进,向右转以及输出当前位置的功能(面经题,之前是乌龟来着),一开始在原点坐标,不能去负的坐标,去的话报错。

follow1:输入指令,如 FFRRF3R,F就是前进,R就是向右转,2R就是RRR。输出这个指令之后所处的位置。

follow2:在指令里面会出现2(FFR)这种情况,就是FFRFFR。 就问了这个就没了,在写follow2的时候感觉和小哥的作法有出入,他让我怎么怎么写,但是我不太理解,改来改去消耗了些时间。最后还是按着我的代码写完了……

40分钟结束问问题。 在google doc上面,感觉撤销有点诡异。不知道是不是同步的问题,当时想回到之前的代码,怎么也回不去了。 感觉自己写的有点慢,题目挺简单的,但也没让面试官很满意。感觉直接给onsite希望不大了……诶,不过还是求个人品吧~ 

链接: https://instant.1point3acres.com/thread/176255 来源: 一亩三分地

  1. 面的是某个multimedia组,打电话的听上去是一个白人小哥,只是介绍了自己的名字便开始出题。

专业题(专业码农同学请忽略):

    1. 说说perceptual audio coding的基本要素?
    2. 如果在audio coding中用fixed frame size会有什么问题?应该如何改进?

coding题:

    1. Given (x, y, r) of the circle (x, y is the center of circle, r is the radius), return whether 2 circles have intersection
    2. 求BCD编码 + 1的值,例如:35的BCD编码是0011 | 0101,给一个BCD的值,输出这个值 + 1的BCD,比如input为0011 | 0101,输出则为0011 | 0110
    3. filter out the given char. 如:给“abcdefg”,需要filter掉的是“a“,则给出的char *应该是“bcdefg”,要做到in place

之前HR跟我说找SWE的人来面试,导致我专业题都没复习=,=,coding题巨简单,可是专业题是乱答的,哎。。

今天HR给我打电话说跪了,搞得特别郁闷,这么简单的题都能跪,我这水平是有多烂啊!总结了一下可能有如下原因吧:

    1. 电话声音不清楚,导致全程跟小哥都没什么交流。就是他出题,我答题,聊的不high
    2. 每次写完一道题,我都心想:这么简单的code不用多加解释了吧,就没手动跑test case,简单解释了下code算完,可能不够专业
    3. 本来2月份就联系HR了,因为coding水平有限,拖到了3月底,可能那个组已经有很好的candidate了
    4. 背景确实不match,没有做audio coding的经验,也是一个短板 从今天开始关小黑屋6个月,anyway,move on了,继续修炼吧。 

链接: https://instant.1point3acres.com/thread/171473 来源: 一亩三分地

  1. 新鲜热辣的谷歌面筋。估计炮灰了。答得很放,面试官也都心不在焉。但是是时候回馈广大同胞了。

设计查询系统(最大值,最小值,最新加入值)

class System { 

 

int getMax(); 

 

int getMin(); 

 

int getRecent(); 

 

void add(long time, int price);

 

void update(long time, int price); 

 

void remove(long time); 

 

例子如下

add(1,4) max:4, min:4, recent:4

 

add(4,7) max:7, min:4, recent:7 

 

add(2,5) max:7, min:4, recent:7

 

etc.. 

能帮大家的就到这里了。祝未来好运:)

链接: https://instant.1point3acres.com/thread/166460 来源: 一亩三分地

  1. 刷题刷累了,上来攒人品! 搞了两次电面,可能是第一次面的不好又给了第二次机会。还好后来过了,明天onsite。。。Finger crossed!

第一次电面:假设除了用1和0表示数字的binary方式,还可以用2来表示,给一个数字,求有多少种表达方式。

例子:

4 = 100, 20, 12 所以答案是3。 

8 = 1000, 200, 120, 112 所以答案是4。这题想了半天没想出来,后来给了提示用dp写出来了。

第二次电面:两题都是lc原题,lc298 (Longest consecutive sequence in BT) 和lc128 (longest consecutive sequence in array)。各位自己去看解法吧!

祝大家找工作顺利!!!

http://www.1point3acres.com/bbs/thread-192677-1-1.html

  1. recruitor email找到我。问我有没有兴趣面谷歌。由于Lz自己确实在准备跳槽。只是没准备好。于是想面一个试试。电话接通了没有废话,直接做题。

给一个tree,每一个treeNode多2个指针pre next但是是空的。要求按inorder的顺序把指针连起来。 Lz用recursion。写的不好。

followup是怎么实现insert方法。还问了时间复杂度和空间复杂度。

第一次面试太紧张,已跪。

祝大家早日找到工作。

http://www.1point3acres.com/bbs/thread-192582-1-1.html

  1. 面试官一美国小哥,简单闲聊后甩题:

给一个 array of words,和favorite letters, 让重新排序array,使得按照favorite letters的priority 排列。 没有包含 favorite letters 的 words 则继续按照 原本字母表 排序

举个栗子:

array:['animal','duck','snake','zebra','horse','mouse']

favorite letter:'zh'

output--->['zebra','horse','animal','duck','mouse','snake']

 

array:['aab','baa','caa','aaa','aaaa']

favorite letter:'ab'

output--->['aaa','aaaa','aab','baa','caa']

算是半个水题。用随便一种sorting自己定义一个 comparator就ok。也可以用类似radix sort 来逐层比较每一个位置的letter。但是本人脑抽,一紧张把quicksort的pivot index搞错被interviewer发现了。估计难逃一死了。

发个贴给大家看一看本人的死相多难看之余,希望大家别犯同样的傻叉错误。。

补充内容 (2016-2-24 07:39):

刚接到电话,居然过了。。美国小哥人好啊,放生积德啊!!继续准备onsite去了。大家也都加油好运!

http://www.1point3acres.com/bbs/thread-173016-1-1.html

  1. Leetcode 原题, missing range 。因为没有做过 电面也很紧张,所以45分钟只有时间做一道题。

所以说 leetcode 收费题目还是应该去花钱做一做的。

http://www.1point3acres.com/bbs/thread-190925-1-1.html

  1. 上周五面的,上来直接做题~

判断一个数是不是rotation symmetric,就是把一个数旋转180度,是不是还是原来的那个数,例如“619”,旋转180度还是“619”;followup:给一个数n,输出所有小于n的rotation symmetric number。 

链接: https://instant.1point3acres.com/thread/176815 来源: 一亩三分地

  1. 面试官也不知道是个东欧人还是印度人,叫做桑杰,在map组工作了五年。一上来先是介绍最有意思的proj,基本没有问问题。接下来接下来就是在gg doc上做题。

我的gg doc上还存着,直接贴上来给大家

补充内容 (2016-4-3 12:24):

题1. A string consists of ‘0’, ‘1’ and ‘?’. The question mark can be either ‘0’ or ‘1’. Find all possible combinations for a string. 01?0 –>0100, 0110

补充内容 (2016-4-3 12:26):

题2 Suppose we have a method “getLongestSubstring(String s, int m)” which finds the longest substring with exactly M distinct characters. Examples: “ABACAAAB” M=2 -> “ACAAA”

补充内容 (2016-4-3 12:26):

There are now new requirements for getLongestSubstring! The string doesn't fit into memory. Instead you get an object of type BigString:

interface BigString { 

public boolean hasNextChar(); 

public char getNextChar(); 

}

Instead of returning a String, return the start index and end index of when the longest substring occurred.

class Substring { 

        Substring(long startpos, long endpos) {

                this.startpos = startpos; 

                this.endpos = endpos;

        }

        …

}

So the new method signature is:

Substring getLongestSubstring(BigString s, int m) 

补充内容 (2016-4-3 12:28): onsite求人品TAT….虽然拿到onsite就已经是赚了….

链接: https://instant.1point3acres.com/thread/171729 来源: 一亩三分地

  1. 一位阿三PHD面的,问了简单的背景问题和两个技术问题。看完问题之后我就知道和Google今年缘尽于此了。

Q) Write a program to count the total number of pages reachable from a website.

For example, given "nytimes.com", count the number of pages reachable from there.

You can assume you are given a function to fetch the page and extract the inner links, e.g.:

List<String> fetchPageAndExtractUrls(String url);

 

Q) Given a tiny computer with a 1 MHz CPU and 1 KiB of RAM memory;

no input;

only output is an LED light that says “I am done”.

(1 MHz == 1 million instructions per second)

I load an arbitrary unknown program onto this computer.

How long do we have to wait in wall-clock time before we can prove the program has an infinite loop?

我觉得第二题应该这么想:

因为数据和程序都在内存中,所以,如果在某这两个时间点,内存中的内容处于完全相同的状态,那么从这两个时间点之后的所有状态也一定会完全相同(除非这是台量子计算机)。那么,如果一个程序在开始执行之后,内存先后出现两个完全相同的状态的话,那么这个程序一定是死循环

1kilobyte = 2^13 bit, 所以该计算机内存可能存在的不同状态是2^14种。

因为每次instruction都一定会改变内存的状态(因为但凡有一次不改变,那就已经死循环了),所以这个计算机最大能执行的不相同操作是2^14次(因为如果程序在2^14次操作中还没能停机,那第2^14+1次操作一定和之前的2^14次操作中的某一个相同)。 又因为运行速度是1秒10^6 = 2^20次操作,因此在2^(-6) = 0.016秒内,就能够进行2^14次操作。也就是说,如果0.016秒内还没能停下的程序,就永远不会停下了。

补充内容 (2015-8-13 20:47):

抱歉,此楼的“状态数”是不正确的。更新过的答案请看16楼

不好意思,我之前的答案完全搞错了。2^13(也就是8000)维的向量总共能表示的状态数不是2^14种,而是2^(2^13) = 2^8000 种(就像3维向量能表示的状态数是2^3一样)! 在1s执行2^20次的计算机上,最多需要2^(8000 - 20) ~= 10^2400秒!这数字远远超过宇宙年龄,也就是说,通过观察判定程序是否是无限循环是不实际的。这次应该没算错……吧。

http://www.1point3acres.com/bbs/thread-134847-1-1.html

  1. 刚刚结束的Google电面,在google呆了8年的貌似国人大哥。
    1. 判断一个树是不是另一个的subTree.
    2. shortest palindrome. 求个onsite (KMP 算法)

链接: https://instant.1point3acres.com/thread/176963 来源: 一亩三分地

  1. 这周二面的Google,太紧张了 脑袋木木的开始聊了聊简历. 然后问了很多关于C++的知识,继承多态虚函数之类的,简单提了提虚函数表以及一些hash table的实现

coding题目是这样的,一个字典,里面很多单词,例如

google, leg, about, lemma, apple, time

找这样的pair <A, B>,有两个条件, (1) A单词的后两个字母和B单词的前两个字母一样 (2)A单词的第一个字母和B单词的最后一个字母一样,例如<google, leg>就是一个合格的pair,<apple, lemma>也是一个合格的pair, <about, time>不可以,然后求这样的pair的最长长度,<google, leg>的长度=6+3

我开始没听见他说这个dictsorted,太紧张了唉。

我只好用了个很sb的方法,用每个单词的最后两个字母建了一个map,然后再扫一遍寻找所有的pair 分析了复杂度,要分析的很准确, 

后来他提醒了一下是sorted,有吭哧写了个带binary search的版本,BinSearch的函数没来得及写

后来又问could we do better 已经没有时间了, 唉 感觉挺简单一题,写的太慢。 

不知道有没有其他很简洁的办法。。LZ弱的跟猪一样

然后三天之后HR打电话来,说did well,被proceed到Youtube了。 求问有没有类似经历的小伙伴,Youtube和Google貌似在不同的location,难度有什么不一样么

Anyway,已经做好move on的准备了。。总比直接挂了好。。

http://www.1point3acres.com/bbs/thread-185123-1-1.html

  1. 给定一个棵树,树的节点是一个的值是一对pair, 树可能有很多children,然后要做的就是给定一个pair<x, y>查看是不是能在一个树的同一高度上,找到这两个值,并且x只能在第一个位置,y只能在第二个位置。

第一问:写算法,楼主写了BFS的算法,也说DFS可以实现

follow up: time and space complexity.

follow up: if I want to get space O(logn)的算法,怎么做。 楼主说如果树不是balanced话,dfs也要O(n), 然后面试官说假定树是balanced,就是说高度为O(logn), 这里纠结了一小会,因为没有确定面试官说的话,以为要求O(1)的解法,并且不能用dfs去做。 后来make sure了一下需求,就说dfs很可以解决。

follow up: 找树的规律,每对节点都是一个interval,并且每个子节点将父亲节点的interval进行划分 和interval tree一样。

follow up: 改一开始的code,是不是提高效率,加上interval的剪枝,写了代码。

PS: 快10天了,hr一直没有消息。。。是不是挂了--楼主的oa也是10多天才有消息,中间一周的时候催了一下hr,现在急需发邮件问的话,会不会太aggressive了。

http://www.1point3acres.com/bbs/thread-179798-1-1.html

  1. 是个印度小哥,打电话的时间就晚了五分钟,跟我聊了十分钟,最后还提前结束了,做题的时间就很少了。

最后只做了一道题:自己实现一个hashtable的insert,delete,search,getRandom,全部都要O(1)

时间紧迫,而且一开始没明白他的意思,边问边写~就写了这一道,小哥全程比较冷淡,但是还是有回答我的问题的!

也不多想了,应该是要挂了~. 

http://www.1point3acres.com/bbs/thread-178900-1-1.html

  1. 發一下之前一月底Google的電面,一開始打來就是簡單的自我介紹聊聊project之後就開始給題了。

題目是:

Given a set S of 10^6 doubles. 

Find a number X so that the [X, X+1) half-open real interval contains as many elements of S as possible.

 

For example, given this subset: 

2.7, 0.23, 8.32, 9.65, -6.55, 1.55, 1.98, 7.11, 0.49, 2.75, 2.95, -96.023, 0.14, 8.60.

 

The value X desired is 1.98 because there are 4 values in the range 1.98 to 2.97999 (1.98, 2.7, 2.75, 2.95) 

這題我的解法是先sort過一遍之後再使用two pointers找,那時面完就覺得沒有說得很順,後來結果也是掛了~~ 希望可以幫我加點分!! (排序然后利用队列存储范围内的数据);

链接: https://instant.1point3acres.com/thread/162322 来源: 一亩三分地

  1. 星期一电话面试。是一个印度哥哥。之前觉得印度哥哥没什么,因为学校印度人很多,工作地方也是印度人,口音不是那么难以理解啊。但是这次,我晕。不知道是我理解有问题还是怎么着。anyway,上题。

给一个integer array,让你求比array  (where i is from 0 to array.length() - 1) 大的maximum number of element i.e 就是求每个integer右边比它大的个数,求最大值。

e.g. 

A = [2 3 0 1 5 7 4]

     4 3 4 3 1 0 0   

answer is 4

(两种解法,一种二分法寻找,另外一种用BIT.)

http://www.1point3acres.com/bbs/thread-178983-1-1.html

  1. 电面一面的面经在这里.

http://www.1point3acres.com/bbs/thread-183067-1-1.html

这次是第二面,第一面题好难LZ没答好,二面题目就超简单我也是被这个差距给惊狗带。不求offer,求个onsite体验一把啊哈哈哈

大概就是取一个array里的任意n个不同的值,得到一个随机的组合,不能取同一个index的数,但是可以取数值相同的不同index的数

给一个array:[5,1,3,3],

再给一个数字n:2,

求这个array里的任意num个数:比如可以得到[5,1] or [5,3] or [1,3] or [3,3] ,但是不能得到[5,5]

 

再比如[5,1,3,3], 1 ===> [5] or [1] or [3]

LZ就是先判断如果n>array.length或者n<=0或者array是空,返回一个空array,否则就是一个loop,每一次生成一个random的index数字,还用了一个hashset来存之前访问过的index,如果生成的random index之前已经get了,就再继续生成一个random index。

loop n次,每次取到的值放进新的结果array里。

然后说了说也可以用一个boolean array存每个值有没有已经取到。。

写完后再写了写unit test什么的,还有问道怎么检测得到的结果比如[5,1]确实是[5,1,3,3]里的..

问问大家有没有更优的方法啊

http://www.1point3acres.com/bbs/thread-188731-1-1.html

  1. 1个小时前结束的电面,开始时问了两次他的名字,仍然没有听清,只能作罢。

就问了句:你是PhD是吧,我说是ECE的PhD,然后就直接开始coding

题目是:

给你两个文件f1和f2,f1是10M的量级,f2是10G的量级。f1的每一行有三个东西:str1, str2, ratio,ratio代表str1和str2的比值,示例:

1. A, B, 0.5         // 解释:A / B = 0.5

2. A, E, 2.3         // 解释:A / E = 2.3

3. C, E, 1.5         // 解释:C / E = 1.5. From 1point 3acres bbs

4. C, D, 1.0         // 解释:C / D = 1.0

5. ...

f2的每一行只存了str1, str2,示例:

1. C, B   

2. A, D

3. ...

需要返回一个新的文件叫f3,f3是在f2的基础上更新,并且和f1的格式一样,即你需要算出f2中每一行两个string的ratio,比如上面的例子的话,就是返回下面这样:

1. C, B, 0.33     // 即:C / B = C/E * E/A * A/B = 1.5*1/2.3*0.5 = 0.33

2. A, D, 1.53     // 即:A / D = A/E * E/C * C/D = 2.3*1/1.5*1 = 1.53

【参考LC 399 evaluate divison,DFS solution,设置一个VISITED变量,注意重复】

  1. 刚刚面完:第一题:给一个array,找出最长的连续片段   比如:[5,2,3,4,5,8,9]   就是2,3,4,5,返回4

我觉得这道题很眼熟,但是忘了最优解了,所以最开始写了一个看似两层循环但是time O(n),space O(n)的。但是小哥觉得还可以优化,所以开始提示我了,然后我在自己代码的基础上改了改最后改成了time:O(n),space:O(1)最优解

第二题:还是找最长连续片段,但是是在树里面。因为第一天调到最优解就已经花了35分钟了,第二题讲了一下思路,准备用pre-order traver加stack来做,小哥说这个解不是最优但是勉强还行。就没有写代码了,写了一下步骤就结束了

祝愿能来个onsite吧。。。Amazon和Bloomberg onsite全跪了。。。纽约没剩下几家可以面的了。。。

补充内容 (2016-4-1 23:56):

第一题“不是”leetcode上面的longest consecutive sequence,同志们不要搞混了,要是那道题我也不敢大言不惭说是最优解了。。。请看清楚例子。。。后一个元素必须是前一个元素+1。。

http://www.1point3acres.com/bbs/thread-183713-1-1.html

  1. 第二轮电面跪经,面试官迟到7-8分钟。 说是手机找不到了。 大概聊了一下以前做的project,开始做题。

题目是给你一个board,里面存储user的信息,user有id和socre。

board有adduser(id, score)(返回add进去的user当前的rank), findByRank(k) (这个返回id)。

Add如果本身已经有id在board中,需要对这个id的score进行update。

  1. 今天下午二面,西班牙哥们儿(入职一年),两题:
    1. 找到一个数组中递增子串的最长序列的长度。 就像[2,1,3,4,5]递增子串就是[3,4,5]
    2. 找到一个二叉树中递增的sub tree的某分支最长序列长度。 

例如

  0

  / \

1   3

/ \   \

   2   8   4

\    

5

这样返回的就是3, 因为有3, 4, 5。 这两题算简单了啊。

上次面试的题目是给你一个collection 要求对collection里面的元素进行添加(object), 删除(object), 随机取(object)这三个操作,要求常数时间复杂度

求加米~~~

http://www.1point3acres.com/bbs/thread-178080-1-1.html

  1. 刚刚电话面试结束,第一题:

Print elements of a tree in level order. E.g., given the tree:

 

A

  / \

  B   C

/   / \

D   E   F

  /

  G

The program should print out:

A

BC

DEF

G

没错,你没有看错,就是level order travers binary tree, 没有任何的变形,leetcode的easy的原题。上来跟小哥讲了下思路,用queue实现,然后就噼啪代码敲完了,小哥就问了一下queue.poll()是什么作用(他长时间没有用java编程了)。之后我就缕着代码给他讲了一遍,讨论了一下corner case,本身这个基本上也没啥corner case, 然后小哥说,比我想象中的完成的快好多。

第二题:

Football:

{2, 3, 6, 7, 8}

9 = { 7 + 2, 6 + 3, 3 + 3 + 3, ... }

don’t need both 6+3 and 3+6

其实就是leetcode combination sum的原题,给你一个数组,一个target,求所有的组合方式。 上来先和小哥讨论了下输入项的可能性,然后噼啪一顿代码又出来了。小哥给了个case,然后我就把代码的执行过程给写了出来,小哥还比较满意。然后就问我可能出现的一些corner case,然后我就讲可能空数组啊,target value可能是0啊,可能有负数啊,等等。

关于这个几个corener case的输出,跟小哥探讨了一番,关于返回{}还是{{}}讨论了一下,结果就是根据实际的要求来做,小哥表示认可。讨论到负数的可能性,发现代码会进入死循环,果断表示不能允许duplicate的存在,小哥也恩恩表示赞同了。

最后一题:

Input:

 

BB

BBE

BAD

BACE

BED

DAD

ABBC

ABBA

 

(Known lexicographically sorted, under unknown alphabet order.)

 

Output: B<D<C<A<E.

http://www.1point3acres.com/bbs/thread-177259-1-1.html

  1. Google 电面是和fremont office的印度小哥, 做了一道题目15分钟,然后聊了30分钟,过了。

题目是, 一个string, 有空格,有引号,sparse string, 两个引号中间的部分的空格不处理, 引号外面的空格将前后划成两个String。

做法就是traverse一遍就搞定了,细节处理一下。

然后问了test case, 时间复杂度空间复杂度。

http://www.1point3acres.com/bbs/thread-188226-1-1.html

  1. 给一个sorted int array 定义popular item的frequency/occurerence 大于N/4

求item 值最小的frequency.

  1. Range maximum query

一开始扯了20分钟楼主做过得project,问了一下最challenging的part.

然后直接 就是range maximum query, 给一个array, 求[start,end]中的最大。

反正他就一直要求优化,写了三种方法(从最简单的开始)之后,楼主无能为力了,然后就谈谈time和space。 我看wiki有O(1)time, O(n)space的,但是表示不懂。

http://www.1point3acres.com/bbs/thread-177692-1-1.html

  1. 上来聊了下debug中遇到的挑战和怎么解决的, 聊了10min。

第一题 atoi 只考虑正数,写了一些test case,没啥问题。

第二题 没见过,有一个4-way stop的路口,4条lane, 给两个function getNextCar(), arriveCar(Car car, Lane lane),要求实现这两个方法。【利用两个队列 queue<int> lane; 

queue< queue<int>> q;]

就是生活中一个intersection有4个stop sign,然后看看哪条lane的车应该先走。理解完题只剩10min,写了一会儿发现好烦,最后没时间了,说了下思路,还有好多核心code没写。。 估计挂了。。。

http://www.1point3acres.com/bbs/thread-188010-1-1.html

  1. LZ选的Seattle position,准时收到电话,听声音像是个很nice的白人小哥。

开场让我自我介绍,聊了个project,然后出题。

题目:

input 是一个游戏的后台log (可以自己定义结构):

(1) update log,每条记录是 (time, player, role),比如 (2016 March 11 13:10 UTC, 'mark', 'knight')

(2) play log,没条记录是(time,player),比如 (2016 March 12 12:10 UTC, 'mark')

 

output是每个role出现的次数。

面试过程:

问清楚input&output,说input结构可以自己定义。我的回答是把所有update建一个 per-user map,update list按序存成数组。每次读play log,按player找到update list,然后binary search。时间NlogL, N是play log长度,L是per-user update list 的最大长度。

快写完的时候,小哥说可以先不写binary search 容易错,我们先linear scan。。。小哥一直很nice应该不是BS我。。。写完给我提了一个小bug然后问了下test case。

总结:

自我介绍加聊project大概六七分钟的样子,clear question和说解法也是六七分钟,十五分钟边说边写完了之后,说完test cases就只有七八分钟了,小哥说差不多还是留几分钟那我们就进入提问环节吧。

感觉写的速度一般,不快不慢,说话不够简洁浪费了点时间,都需要多练啊。。。求过!

补充内容 (2016-4-10 00:05):

补充一下,output是要用play log去找每个role的 登陆次数

避免引起歧义解释下。。update表示某个时刻某个玩家切换了角色,play log表示某个时刻某个玩家登陆了游戏,也就是要用play log的时间找该玩家play 的role,然后统计次数,登陆一次就算一次

再举个例:play log里有4条记录,mark 3条,jack 1条,mark玩过两次wizard一次knight (切换角色反应在update log里),jack玩过一次wizard,所以wizard一共3次,knight一次

实际上,需要按照play log来找在当前这个时间,玩家的role是什么(因为在这个play发生之前,玩家可能换过很多种role)。因此,首先将update log建成key为user,value为按时间排序的pair<时间,role>。搜索play log的过程中,用Binary search搜索该用户对应的所有update条目,找到当前play时间之前的最后一条update记录,就是目前该用户的role。

http://www.1point3acres.com/bbs/thread-179863-1-1.html

  1. 印度大哥,不太友善,上来聊了两句就开始做题。

不贴题目,然后带着印度口音口述了题目,我没怎么听懂,然后问他有没有example给我一个,如下:

大意是有一个办公室,in代表进入办公室的时间,out表示出办公室的时间, 每一个event都有in和out两个参数

A in:5 out:10 

C in:12 out: 15

D in: 25 out:30

B in:7 out:13

 

求最长的办公室被连续占用的区间

上面连续占用为 [5, 15], [25, 30]。因为要求最长的,所以返回[5,15]。

我的方法是按照 in 的时间进行排序,然后就维护最长区间的两个变量就行了。复杂度 nlogn

但是印度大哥一定要我优化,我实在想不出怎么优化复杂度了,印度大哥一点提示也没有然后也不说话,我无奈之下随便扯了一点数据比较大什么的。

http://www.1point3acres.com/bbs/thread-164790-1-1.html

  1. 先聊了一下research然后就开始做题

第一题是random generator的题,比如给100*100的matrix,初始为全零,让随机把其中p(比如百分之六十)的值设为1

第二题是tree level order traversal,按层输出,只用打印出来就可以了

http://www.1point3acres.com/bbs/thread-188230-1-1.html

  1. 今天面试非常简单

给你一个数字 拆成个位数相乘 一直重复 知道那个数不能再拆

http://www.1point3acres.com/bbs/thread-185885-1-1.html

  1. 刚面完一波google,速度来发帖赞人品。

面试官是老美,Android组的,声音好沙哑,刚开始一直听不清他说啥。讲道理应该先聊聊简历寒暄寒暄,问候完他直接上题。题并不难,只不过我刚开始有点懵逼,有点犯傻,没进入状态。

    1. Binary tree lowest common ancester. lowest common ancester他是定义为longest path from a leaf to the root,貌似和leetcode那个题不太一样。找最长路径上的那个叶子节点。
    2. 你有 10^12个short integer,然后找出largest top100。最直白的方法就是用heap,分分钟完成。然后我想当然的说可以用hashmap,因为short integer 大概范围是-32000~32000,差不多64000个数,然后怎么弄key-value我不太清楚。他说heap is perfect enough,hashmap这个key-value pair不太好搞 - -。第二题就这么结束了。
  1. 53.给出一个 list of int, the target, 输出这个 list 中所用的数能否通过4则运算 得到 target。
  2. 54.boolean EvaluatesTo(list numbers, int target)
  3. 55.[2 3 6 9] -> 75
  4. 56.(2+3)*(6+9) = 75 return true
  5. 57.[2 3 6 9] -> 11 return false

顺便求米,谢谢

http://www.1point3acres.com/bbs/thread-186172-1-1.html

  1. 今天google 小哥一上来直接问题目 用google doc写的

一锅汤,有胡萝卜和汤,各50份。然后有一堆人会来接汤,有四种人 a. 接一份里面有75%的胡萝卜,25%的汤 b. 接一份里面有50%的胡萝卜,50%的汤 c. 接一份里面有25%的胡萝卜,75%的汤 d. 接一份里面有0%的胡萝卜,100%的汤

请问 当没有汤的时候,还剩下胡萝卜的这种情况的概率。

http://www.1point3acres.com/bbs/thread-183037-1-1.html

  1. 第一次DOC写代码的体验给了google.全程都很紧张。 听口音小哥像是欧洲人,但是非常NICE,说如果没听明白一定要和他确定。

前两分钟自我介绍了一下在哪个组我其实没听出来说的太快然后没问任何简历上的问题就直接开始了。

1. Given two number a and b, find all the binary representations with length a and has b number of 1's and output in decimal in sorted order

Example:

input: a = 3, b = 1

[001, 010, 100]

output: [1, 2, 4]

Explain time and space complexity. 

 

2. Determine if two int array is permutation. 

刚开始觉得这个题太简单了还跟他确定了一下不是next permutation, 只要判断是不是permutation就好。

input: [1, 1, 0] and [0, 1, 1] 

output: true.

Explain time and space complexity.

两道题都非常简单,大概不到三十分钟就写完了然后愉快地聊了一会天。 小哥一直在说自己很喜欢在Google 工作什么的,讲啦一下最近在用GO做的项目。 感觉小哥和我一样紧张,然后没有很多follow up的问题。发面经攒人品希望on site。

补充内容 (2016-3-18 02:26):

可以去onsite啦开心。

http://www.1point3acres.com/bbs/thread-179135-1-1.html

  1. 两周前约的电话面试,今天中午面的,希望不要跪,发发面经攒人品。

1) 一个binary tree,如果对其进行in order traverse,但要求是iteratively。

2)  第二题,我没见过,表面看着也非常简单,但因为太简单,反而让我有些慌乱。

Given:

int[] F of size k, with numbers in [0, k)

int a_init, within [0, k)

int N

A_0 = a_init

A_1 = F[A_0]

A_2 = F[A_1]

...

A_i = F[A_i-1]

 

 

Find A_N.

其实题目本身,特别简单,一个N次的循环,就能找到最后的答案。当时我压根就没把这三行代码当成solution,就一个劲的想优化算法。

当时我犯了两个错误:1. 怎么样我都要把暴力解法给出来,但是我居然傻乎乎的避开了,他还以为我这个最简单的solution都没想出来。 2. 我当时想要的优化结果太aggressive了,想着优化到O(1)时间,导致自己陷入自己的思维陷阱出不来。

http://www.1point3acres.com/bbs/thread-184340-1-1.html

  1. 面试就考了一道题, 整数加1. 比如 【1,2,3】 加一就变成 【1,2,4】。 很简单,一会就做出来了,然后他随便问了几个其他问题,就完了。也不知道到底结果如何

http://www.1point3acres.com/bbs/thread-182643-1-1.html

  1. Suppose you have a list of prime numbers in order, but not consecutive.

For example [3,7,13]

Find the N smallest integers in order which have only these primes as factors.

For example [3,7,9,13,21,...

[参考UGLY number]

  1. 题目是: 写一个function 求 一个数(可以是任意数) 的 root of squre。。。。来跟大家分享phone interview的两道题

write a matrix class

    1. set(int i, int j, int value)
    2. sum(int i, int j) 

可求(0,0)到(i,j)整个square matrix elements的和

    1. 2sum BST

第一题楼主用HashMap做的,思考了好久,sum只能想到O(N*N)的解,我是不是蠢得没谁了。导致第二题没写完,只写了个outline。好在面试官表示知道我的想法了......

 

第一轮 印度小哥
小哥在Google 8年了,太资深了
题目是,在发邮件的时候,比如输入 ben ,下边会提示名字(FirstName, LastName)或者邮件以 ben 开头的人,设计一个类来完成这个提示功能。假设每次我们返回最多10个这样的结果。

Follow up I,如果希望返回的结果是alphabetic有序的,比如输入ben的时候, benaa 在 benbd 前面,怎么设计。
Follow up II,如果我们希望FN是ben开头的在LN是ben开头的前边,比如 ben Back 在 ben Smith前面怎么办。

第二轮 可能是个国人姐姐 姐姐用的英文名字。。。
国人姐姐从进门就笑呵呵的,自然就放松好多
开始的题目是LeetCode的Zigzag Iterator
比如我们有一个 Iterator<iterator>, 这个里边是iterator
i1 1, 2, 3
i2 4
i3 5, 6
然后结果返回 1,4,5,2,6,3
Follow up是,如果这些iterator都有hasPrevious(), previous()方法,意思就是后退一步,你的class也应该有这两个方法,来后退一步
比如我们现在结果返回了 1,4
这时候原来的iterator变成
i1 2, 3
i2
i3 5, 6
如果调用previous(),变成
i1 2, 3
i2 4
i3 5, 6</iterator

有一个情况是如果现在结果返回了 1,4,5,2
这时候原来的iterator变成
i1 2, 3
i2
i3 5, 6

那么调用previous的时候怎么知道调用 i1.previous() 还是 i2.previous()

最后姐姐跟我大概讨论了下concurrent怎么办
用个lock,或者用sigleton pattern,对这个synconize 这个 instance

最后要走的时候,我问了下姐姐对previous的最优解是什么,当时可能面完太放松了。。。小姐姐说的没记住,可能的意思是对于每个iterator,我们keep track什么时候调用了这个的next,然后后撤一步。 好像不太对。。。sorry我忘了原话是什么。。。

午饭 一个国人小哥
紧张的没吃多少,估计小哥也没吃太饱吧。。。好对不起他。。。qucik吃完之后,小哥说如果你想的话带你看看campus,大概转了一圈,太大了。。。

第三轮 国人大哥
大哥也不能算高冷,就是特别严肃
上来先warm up了下,如果我们要在internet传输数据的话,我们要compress和encrypt数据。我们应该先compress还是先encrypt

我什么都不知道。。。我就瞎说了下,然后大哥说,看起来你真的是know nothing about this… 我就傻了。。。。

大哥说,没事,这就是个warm up, 来继续战斗,来个算法题吧
如果你和另外两个朋友出去玩,每个人付一部分钱,比如你掏了car rent, 另一个人付了hotel等等。最后回家了,你们想AA,最后你们每个人付的钱都一样,写个方法能返回谁应该给谁多少钱
比如三个人分别掏了5,3,1,那么a[2]应该给a[0] 2 刀
如果现在有n个人的话,应该怎么办

class Solution {

public:

    int minTransfers(vector<vector<int>>& transactions) {

        unordered_map<int, int> m;

        for (auto t : transactions) {

            m[t[0]] -= t[2];

            m[t[1]] += t[2];

        }

        vector<int> accnt(m.size());

        int cnt = 0;

        for (auto a : m) {

            if (a.second != 0) accnt[cnt++] = a.second;

        }

        return helper(accnt, 0, cnt, 0);

    }

    int helper(vector<int>& accnt, int start, int n, int num) {

        int res = INT_MAX;

        while (start < n && accnt[start] == 0) ++start;

        for (int i = start + 1; i < n; ++i) {

            if ((accnt[i] < 0 && accnt[start] > 0) || (accnt[i] > 0 && accnt[start] < 0)) {

                accnt[i] += accnt[start];

                res = min(res, helper(accnt, start + 1, n, num + 1));

                accnt[i] -= accnt[start];

            }

        }

        return res == INT_MAX ? num : res;

    }

};

写完了之后,大哥问,最需要多少次transaction,一个人给另一个人钱的话算一次,我心想的是 O(n – 1) 就是 O(n), 大哥说specific answer, 就是 n – 1次
然后Follow up,如果每次transaction特别麻烦,不管是时间还是空间都特别麻烦。如果不用考虑everything, 不考虑cpu, 不考虑硬盘,我们想让这个次数最少,怎么办。

第四轮 一个亚裔,还有个白哥哥旁听
题目大概是,每次用户会调用一个方法 double next(double v) 然后函数返回的是这个数之前的 windowSize个数的average
比如windowSize是3,call了 next(10) next(11) next(3) call(1), 第一个返回 10, 第二个返回 10.5, 第三个返回 8, 第四个返回 5
因为我用了Deque来保存之前的数据,我以为他会问精度的问题,我记得面经里有人发过,结果没问。。。所以Follow up 是 如果不用现成的Deque这个class,你怎么办。 好像用个链表更好写。。。我作死说可以用一个rotated array来模拟这个功能,其实也挺简单

Time Line 大概是1.5面 —> 1.7告诉我feedback收集完了但是没告诉我具体怎么样 —>1.11告诉我review team 给了 green light, 应该就是过了hc吧—> 1.19告诉我svp同意了(因为1.19是MLK day,hr姐姐16号请假出去了,要不然按原计划她说可能16号就能给我结果)

找工作真的好煎熬,尤其是身边都是大神,我身边有早早拿到return的大哥,有各种Onsite拿到手软的满GPA大哥,还有早早拿到我dream company的大哥。。。

 

 

两周前onsite,5轮,上周HR打电话HC过了,match了team,现在在等最后VP 和 SVP的review, 求Bless !
有些题版上出现过
Product of word length which words that share no letters(all lower case)E.g {feed , see, stuck }: max product: 5×4=20Complexity?Follow up:optimal way to exit earlier in loop.

2. RLE run-length compression

Encode: helll=> he3xl, decodeRequirements:1. Decode(encode(s))==s; 2. Shortest lengthFollow up: unit test: test requirement 12
3. Word abbreviation,e.g. Between=>b5n,friend=>f4d Follow-up: implement Bool checkduplicate(string [] dict, string word) E.g. {feed }, feed => false;{door }, deer =>true;{dare}, deer => false如果dict里有word 和input word的abbreviation 一样,则return true

class ValidWordAbbr {

public:

    ValidWordAbbr(vector<string> &dictionary) {

        for (auto a : dictionary) {

            string k = a[0] + to_string(a.size() - 2) + a.back();

            m[k].insert(a);

        }

    }

    bool isduplicate(string word) {

        string k = word[0] + to_string(word.size() - 2) + word.back();

        return m[k].count(word) == m[k].size()?false:true;

    }

private:

    unordered_map<string, set<string>> m;

};

 


4. Poland operation list convert to tree E.g. {push 4, push 5, add, push 9, mul, sqrt} => tree: {sqrt,{mul,{9, add(4,5)}}}

5. Design Question: Get program running on data centers, try catch and scalability , cache followups 

第一轮
给一个matrix,一开始都是0。写一个method addRock(int i, int j),实现在i,j位置加入一个rock使其可以变成一个island或者island的一部分,然后这个method要返回这个matrix里有多少个island

Union find solution

第二轮 假设把人类的族谱形成一张图,每个人都是一个node,每个人会有父亲和母亲(也是node),写一个method isBloodRelated(Node n1, Node n2),实现假设n1和n2有共同的祖先,那么就意味着n1和n2是related的。限制是可能有很多代人,然后可以在node加额外的信息。

BFS, 首先建立图的关系,然后利用BFS寻找一个路径看能不能从N1到达N2。 

第三轮
问题1:
给两个实现的method, Collection getActors(String movie) 和 Collection getMovies(String actor)
写一个method int distance(String actor1, String actor2),实现计算actor1到actor2的最短距离。距离的定义是假设两个演员在同一部电影里出演,那么他们之间的distance就是1。follow up是假设数据集很大,有什么方法可以优化。

BFS问题;
问题2:
给一个expression只有+, *, 和数字。然后给一个实现好的method Iterator tokenize(String exp),1问是如何model这个Token,方向是OOD。2问是写一个method int calculate(Iterator iter),实现计算表达式的值。

利用statck,一个stack存储数据,另外一个stack存储+或者*。 

第四轮
问题1:写一个method int longestStringWithAtMostTwoUniqueChars(String s),实现返回最长的substring最多有两个unique的char
问题2:
设计google map的back end的api

第五轮
感觉问得有点偏。他先问如何实现shuffle elements in an array,但是关键不是在实现,而是证明为什么概率是正确的。我没答上来,他引导我用数有多少种可能的permutation来证明。然后follow up是他给了一种错误的shuffle的方法,然后问怎么证明这个算法是错误的。我也没答上来,他就继续引导,我没能很快理解,不过最后在他耐心的解释下,我还是理解了。
由于没剩下很多时间,第2个问题就是问了下在网页上填了个什么东西,然后点击submit后会发生什么,越详细越好。

How does this work?
The probability that ith element (including the last one) goes to last position is 1/n, because we randomly pick an element in first iteration.

The probability that ith element goes to second last position can be proved to be 1/n by dividing it in two cases.
Case 1: i = n-1 (index of last element):
The probability of last element going to second last position is = (probability that last element doesn't stay at its original position) x (probability that the index picked in previous step is picked again so that the last element is swapped)
So the probability = ((n-1)/n) x (1/(n-1)) = 1/n
Case 2: 0 < i < n-1 (index of non-last):
The probability of ith element going to second position = (probability that ith element is not picked in previous iteration) x (probability that ith element is picked in this iteration)
So the probability = ((n-1)/n) x (1/(n-1)) = 1/n

 

posted @ 2018-01-21 03:10  jxr041100  阅读(6359)  评论(0编辑  收藏  举报