面经:Google两轮背靠背
如题,谷歌两轮背靠背电面。两轮都是废话不多说直奔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两轮背靠背的更多相关文章
- 两轮自平衡小车双闭环PID控制设计
两轮自平衡小车的研究意义 ...
- jsoi2014前两轮回眸
今天从常州回来了,第二轮考得惨不忍睹 大概来总结一下前两轮: 第一轮是4个小时,3道题,一道网络流,一道环形DP,一道线段树 最后一道题ahoi的原题(传送bzoj1798),非常水的线段树,是个很好 ...
- 5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...
- 你知道怎么使用Google两步验证保护账户安全吗?
目录 为什么我们需要使用它? 对有些人来说,盗取密码比您想象的更简单 什么是Google两步验证? 多一道安全防线 什么是Google Authenticator ? 使用Google两步验证的好处 ...
- 为Linux服务器的SSH登录启用Google两步验证
对于Linux服务器而言使用密钥登录要比使用密码登录安全的多,毕竟当前网上存在多个脚本到处进行爆破. 这类脚本都是通过扫描IP端的开放端口并使用常见的密码进行登录尝试,因此修改端口号也是非常有必要的. ...
- 华为OD两轮技术面试
华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...
- 阿里饿死了么Android面试凉经,两轮面完被虐哭了,怒清购物车。。。卸载饿死了么
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了 ...
- Google两步验证安装使用方法
http://www.williamlong.info/archives/2754.html
- 阿里前端实习生面试总结(两轮技术面+一轮hr面)
投的蚂蚁金服: 一面(只有13分钟): 1.angular里双向绑定的实现原理: 巴拉巴拉巴拉,这个问题很常见,我提到了$scope.$apply()和$scope.$digest(),面试官问app ...
随机推荐
- Mavan学习之pom聚合
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
- qcow2、raw、vmdk等镜像格式的比较和基本转换
注:本文转自http://www.cnblogs.com/feisky/archive/2012/07/03/2575167.html 云计算用一个朋友的话来说:”做云计算最苦逼的就是得时时刻刻为 ...
- screen实战
VPS侦探在刚接触Linux时最怕的就是SSH远程登录Linux VPS编译安装程序时(比如安装lnmp)网络突然断开,或者其他情况导致不得不与远程SSH服务器链接断开,远程执行的命令也被迫停止,只能 ...
- CentOS7下Elastic Stack 5.0日志分析系统搭建
原文链接:http://www.2cto.com/net/201612/572296_3.html 在http://localhost:5601下新建索引页面输入“metricbeat-*”,之后ki ...
- Spring Cloud Eureka 高可用注册中心
参考:<<spring cloud 微服务实战>> 在微服务架构这样的分布式环境中,各个组件需要进行高可用部署. Eureka Server 高可用实际上就是将自己作为服务向其 ...
- 转sklearn保存模型
训练好了一个Model 以后总需要保存和再次预测, 所以保存和读取我们的sklearn model也是同样重要的一步. 比如,我们根据房源样本数据训练了一下房价模型,当用户输入自己的房子后,我们就需要 ...
- Android-Broadcast(广播)
1.四大组件之BroadcastReceiver (1)Broadcast(广播)--一种广泛运用在应用程序之间传输信息的机制 (2)BroadcastReceiver(广播接受者)--是对发送过 ...
- POJ-2029 Get Many Persimmon Trees(动态规划)
Get Many Persimmon Trees Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3987 Accepted: 2 ...
- Ubuntu 下 kdevelop下 怎么向主函数传递参数
1.打开工程 2.点击窗口上的运行”--“配置启动器” 3.左栏选择要传递参数的工程名,在参数一栏中,输入参数“ubuntu.png”,再输入“工作目录”.点击OK,运行就可以了.
- 数据库和struts2的拦截器
1.READ UNCOMMITTED:脏读.不可重复读.虚读都有可能发生2.READ COMMITTED:防止脏读的发生,不可重复读,虚读都有可能发生3.REPEATABLE READ:防止脏读,不可 ...