如题,谷歌两轮背靠背电面。两轮都是废话不多说直奔coding,虽然第一轮的中国大哥还是花了一点点时间了解了一下我的背景、毕业时间、research方向。说好的research面呢?

中国大哥出的题:

Given a set of integers, print out all the subsets
For example, {1, 2, 3}
output: {}, {1,2}, …., {1,2,3}

我的解法:

 public ArrayList<ArrayList<Integer>> findsubsets (int[] S) {
Arrays.sort(S);
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> set = ArrayList<Integer>();
for (int i=0; i<S.length(); i++) {
helper(set, res, S, i, 0);
}
return res;
} public void helper(ArrayList<Integer> set, ArrayList<ArrayList<Integer>> res, int[] S, int i, int starter) {
if(res.size() == i) {
res.add(new ArrayList<Integer>(set));
return;
}
for (int j=starter; j<S.length(); j++) {
set.add(S[j]);
helper(set, res, S, i, j+1);
set.remove(S[j]);
}
}

问的问题我大概十分钟写出来,但是花了二十分钟给他讲懂。他先没懂。一直在纠结这个Recursion最后怎么终止的,举了个例子比如length=10, starter=8, i=5, 我跟他说这个循环自己就会终止,因为starter始终无法超过s.length,当starter到了s.length, 自然就终止了。他最终懂了,说是对的。这样就过了30分钟,我让他赶紧进下一个问题,他说没太多时间了,就不问了,各种瞎聊,我问了各种问题,从PhD的要求到谷歌的文化。最后实在没可聊的了,就让他出了一道题,我大致讲了一下方法。

Given A list of books in a library, sorted in a predefined order. Books have height {h1, h2, h3, …. hn} and assume all books have thickness 1.
Arrange them on bookshelves that can hold k books at most on each level. The height of each level is the max height of the books on that level.
Find out the minimum total height of all the bookshelves necessary to accommodate all books.

我大致讲了贪心算法和DP的思路,没时间了。他最后的评价是:Generally, what you did is ok. For future you still need more practice, for fulltime job.

第二轮上来的印度大哥口音实在是。。。他没一个问题我都要他写下来。

第一个问题:Write a function to return a copy of a list with duplicates removed.

我问了他好一些问题,比如是不是LinkedList, 还有这个list是不是sorted,还有比如11123,是删成123呢,还是23. 然后就是什么样算是Copy,把这些都搞清楚了之后,我给他讲了大致的方法:O(N),从前到后Scan,每次不重复就把node value存到一个HashSet里面,然后拷贝这个点到新的List里面,代码如下:

 public Class ListNode {
int val;
ListNode next;
ListNode (int x) {
this.val = x;
this.next = null;
}
} public ListNode copy(ListNode head) {
if (head == null) return null;
HashSet<Integer> set = new HashSet<Integer>();
ListNode dummy = new ListNode(-1);
ListNode cur = head;
ListNode runner = dummy;
while (cur != null) {
if (set.contains(cur.val)) {
cur = cur.next;
}
else {
ListNode newNode = new ListNode(cur.val);
runner.next = newNode;
set.add(cur.val);
}
}
return dummy.next;
}

有点小错,比如23行,我忘了移runner了,不知道考官发现没有。这一轮状态不是太好,还有电面我不是太喜欢,不说话总感觉冷场,感觉没机会好好把问题分析透彻。他就问了个问题:Does it preserve the order of the original list? 我给他解释了。他说Java有的interface可以直接用,或者自己定义,我说我prefer自己定义的。

第二个问题:Find max of an strictly ascending then strictly descending array.

我先给了个O(N)的naive算法,他问能不能提高,我说可以用O(logN)类似binary search的方法,用 Recursion来做,每次取whole array的中点,取名a1, 把array一分为二,取前一个array的中点,取名a2, 后一个array的中点,取名a3. 然后比较a1,a2,a3大小关系:

1. 如果array[a1] > array[a2] && array[a1] > array[a3] (我开始的时候比较index去了,后来自己发现了,改了),说明max在 a2, a3之间,下一次recursion进这个range

2. 如果array[a1] > array[a2] && array[a1] < array[a3], 说明max在a1右侧(我开始讲成a3右侧了,他让我再想想,我一下子反应过来了)

3. 如果array[a1] < array[a2] && array[a1] > array[a3], 说明max在a1左侧

这是我考场想到的情况所有情况,我问他怎么看,他think that's it. 电面果然不容易想清楚所有情况,下来想想,其实第2种情况应该是array[a1] > array[a2] && array[a1] <= array[a3],第3种情况应该是array[a1] <= array[a2] && array[a1] > array[a3],但是临场那种紧张情况下我确实想不到那么多细节了。临场写下的code如下:

 public int FindMax(int[] array) {
if(array == null || array.length < 2) return -1;
return helper(array, 0, array.length-1);
} public int helper(int[] array, int l, int r) {
if (l >= r) return array[l];
int a1 = (l + r) / 2;
int a2 = (l + a1) / 2;
int a3 = (a2 + r) / 2;
if (array[a1] > array[a2] && array[a1] > array[a3]) {
return helper(array, a2, a3);
}
else if (array[a1] > array[a2] && array[a1] < array[a3]) {
return helper(array, a1, r);
}
else {
return helper(array, l, a1);
}
}

第7行的停止条件最开始忘了,他问这个Recursion怎么停止,我才发现忘写base case,立马加上,在提醒下改正错误,不知道这扣不扣分。然后第3行s.length-1忘-1. 哎,小错不断啊。最后他让我举个例子推一推:

1 2 3 4 5 4 3 2 1
0 1 2 3 4 5 6 7 8 helper(0, 8)
a1 = 4 5
a2 = 2 3
a3 = 6 3 helper(2, 6);
a1 = 4 5
a2 = 3 4
a3 = 5 4 helper(3, 5)
a1 = 4 5
a2 = 3 4
a3 = 4 5 helper(3, 4)
a1 = 3
a2 = 3
a3 = 3

因为之前的=错误,我推到后面有点不对,正在想办法改,考官说

I'm sorry to cut the interview abruptedly. I didn't realized that I will lose the conference room at 3:45 sharp. Thank you for applying for Google. You should hear from your recruiter in a week or so. Have a nice day!

好吧。。第一次用google doc电面,多少还是多少有点不适应。然后电面这种模式感觉没有面对面的时候更放得开思维广一点,有时候空对空更不容易跟面试官讲清楚自己的做法。总的来说,第一轮第一题应该没什么问题,第二题是我自己要来的,随便讲了讲思路,大致方向(greedy和DP应该是对的)。第二轮第一题忘了runner指向下一个了,不知道面试官发现没有(有时候就在想,他们发现问题了是跟你指出看你发现没有呢,还是嘴上不说心里默默记下该扣分了?)第二题想到这么多我也是尽力了,=的情况确实在当时那种心理状态下没想到无可厚非。以后还要加强这种Corner Case思考的训练。然后写的时候,出了两个小错,在他提醒下改正了。他最后的评价是:You did mostly correct.

哎,人事已尽,成败看天..祈祷

面经:Google两轮背靠背的更多相关文章

  1. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  2. jsoi2014前两轮回眸

    今天从常州回来了,第二轮考得惨不忍睹 大概来总结一下前两轮: 第一轮是4个小时,3道题,一道网络流,一道环形DP,一道线段树 最后一道题ahoi的原题(传送bzoj1798),非常水的线段树,是个很好 ...

  3. 5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...

  4. 你知道怎么使用Google两步验证保护账户安全吗?

    目录 为什么我们需要使用它? 对有些人来说,盗取密码比您想象的更简单 什么是Google两步验证? 多一道安全防线 什么是Google Authenticator ? 使用Google两步验证的好处 ...

  5. 为Linux服务器的SSH登录启用Google两步验证

    对于Linux服务器而言使用密钥登录要比使用密码登录安全的多,毕竟当前网上存在多个脚本到处进行爆破. 这类脚本都是通过扫描IP端的开放端口并使用常见的密码进行登录尝试,因此修改端口号也是非常有必要的. ...

  6. 华为OD两轮技术面试

    华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...

  7. 阿里饿死了么Android面试凉经,两轮面完被虐哭了,怒清购物车。。。卸载饿死了么

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了 ...

  8. Google两步验证安装使用方法

    http://www.williamlong.info/archives/2754.html

  9. 阿里前端实习生面试总结(两轮技术面+一轮hr面)

    投的蚂蚁金服: 一面(只有13分钟): 1.angular里双向绑定的实现原理: 巴拉巴拉巴拉,这个问题很常见,我提到了$scope.$apply()和$scope.$digest(),面试官问app ...

随机推荐

  1. remote: fatal: could not read Username for 'http://spapa.wicp.net:3000': No such device ors

    解决办法: git remote add origin https://{username}:{password}@github.com/{username}/project.git in my ca ...

  2. SQL Server2008 R2 安装失败后的解决办法

    当你第一次安装SQL Server2005,SQL Server2008,SQL Server2012失败后,第二次重新安装一般还是容易安装失败,原因就是你没有完全卸载,还存留残留文件和注册表. 我安 ...

  3. 【CF708E】Student's Camp 组合数+动态规划

    [CF708E]Student's Camp 题意:有一个n*m的网格,每一秒钟,所有左面没有格子的格子会有p的概率消失,右面没有格子的格子也会有p的概率消失,问你t秒钟后,整个网格的上边界和下边界仍 ...

  4. Springmvc配置文件application.xml 和 spring-servlet.xml

    文章来源:http://blog.csdn.net/tengdazhang770960436/article/details/48395885 1.SpringMVC 的配置分为两部分 applica ...

  5. iOS - 获取安装所有App的Bundle ID

    先导入#import <objc/runtime.h>头文件 使用runtime获取设备上的所有app的bundle id // Class LSApplicationWorkspace_ ...

  6. Spark2 Linear Regression线性回归

    回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多重共线性情况下运行良好. 数学上,ElasticNet被定义为L1和L2正则化项的凸组合: 通过适当设置α,Ela ...

  7. 关于python的【if __name__ == "__main__":】

    学习东西真的需要自己动手,然后遇到问题,自己学着去解决.当然如果能得到高人指点,那真是走了八辈子运了.可以节省很多时间.但是大多数情况下,不能总是有高人来指点我们.这时就需要靠我们自己了. 在学习py ...

  8. 8.29 jQuery

    2018-8-29 13:22:26 jQuery : http://www.cnblogs.com/liwenzhou/p/8178806.html 都快开学了!我得在家渡劫! 今天下午去俺弟家玩去 ...

  9. PostgreSql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) select a.relname as name , b.description as value from pg_class a ) b on a.oid = b.obj ...

  10. PHP静态化(非伪静态化)

    什么是PHP静态化 PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前,PHP静态化分纯静态化和伪静态化,两者的区别在于PHP生成静态页面的处理机制不同. 为什么要让网页静态化 ...