面经: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 ...
随机推荐
- 你可能不知道的shell、bash二三事(Centos 7)
个人.bashrc: ~/.bashrc: # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp ...
- Pexpect学习:
pexecpt run用法:格式:run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None,logfile=Non ...
- Python3设置在shell脚本中自动补全功能的方法
本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...
- thinkCMF----增删改查操作
thinkCMF的增删改查基本操作: 一.增加数据 $res = Db::name('form')->insert($data); 示例代码: public function index(){ ...
- 8.29 jQuery
2018-8-29 13:22:26 jQuery : http://www.cnblogs.com/liwenzhou/p/8178806.html 都快开学了!我得在家渡劫! 今天下午去俺弟家玩去 ...
- python----题库(一)
1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py #必须在首行有 #!/usr/bin/env pyth ...
- 洛谷P2569 股票交易【dp】【单调队列】
题目描述 最近 \text{lxhgww}lxhgww 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\text{lxhgww}lxhgww 预测到了 ...
- java 中方法的重写
方法的重写 1.在子类中可以根据需要对从基类中继承来的方法进行重写. 2.方法重写必须要和被重写方法具有相同方法名称.参数列表和返回类型. 3.重写方法不能使用比被重写方法更严格的访问权限 4.注意与 ...
- 一套准确率高且效率高的分词、词性标注工具-thulac
软件简介 THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能.THU ...
- Kettle 4.2源码分析第三讲--Kettle 转换机制transformation介绍
转换机制 每个转换步骤都是ETL数据流里面的一个任务.转换步骤包括输入.处理和输出.输入步骤从外部数据源获取数据,例如文件或者数据库:处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤.输出步骤 ...