回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

谷歌两次电面面经

全局:

2018(1-3月) 码农类General 博士 实习@google - 内推 - 技术电面  | | Pass | 应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
这篇帖子分享我面试18年google暑期实习的经过,包括一点刷题经验和电面面经。

我17年9月-11月比较集中地刷了一些题。在此之前,我在16年也10-12月也刷过题,不过那个时候是随便做做,没有花很长时间。一直到面试前,在leetcode上做过的题大约有300道。其中,我按照知识点,把一些知识点(比如BFS,DFS,二分法,union and find等)的常考题刷了多次。但是还有很多题做完一遍就忘了,我也没有复习。leetcode的discuss中有很多优秀解法,可以参考。
临近面试之前,我买了会员,开始刷leetcode上tag为google的题目。但是这一部分题目增加非常快,有好几百道,而且没有什么定式,很多不能用之前的刷题常用套路来套。所以我只做了所有easy的和一小部分medium的,练了练做新题的手感。据说Facebook的题目很容易碰到原题,而Google有很大的题库,不容易碰到原体。所以面试的时候也有碰运气的成分,看当时能不能想出来了。

第一次电面在十一月份。面试时,面试官会给你题目,但是不像刷题时有定义好的函数让你填,函数要自己定义。我的第一场遇到了原题,是 m
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
录在一个log里。log只能写入,不能删除。
我不是很漂亮地写完了。第二问,是如何改进这两个API。我只好胡说一气。结束后,得知比较好的答案是,time可以用本地的time,而不依赖于传来的time 参数。因为可能有网络延迟。

第二次面试,第二天就告诉我通过了。但是也有很多人是面试完很久才通知的。这是因为面试官feedback有可能给的很慢,不代表每面好。

我觉得刷题的时候,因为不太好撞到原题,所以还是要注意基本功。另外,面试的时候,hangout面试真的比电话面试感觉好太多了。和面试官能互相看到的话,交流会非常顺畅。他们对面试的打分重要的一项就是否擅长交流,占权重的四分之一。

评分

参与人数 2大米 +25 收起 理由
hurricane_e + 20
edyyy + 5 给你点个赞!

查看全部评分


上一篇:电面 nvdia
下一篇:G家店面新鲜面经
推荐
lf963 2018-3-29 08:23:56 | 只看该作者
全局:
给定一个 tree 和一个 API,要求删除tree中的一部分节点,返回删除节点之后形成的forest。可以对每个节点调用这个API,API会告诉你此节点是否需要删除。比如
  1
/   \
2   3
/    / \
4   5  6
删除 2,5 节点的话, 就要返回 forest
[4,1]
         \
          3
           \.
           6.

  1. import java.util.*;
  2. public class RemoveTreeNode {
  3.     public static void main(String[] args){
  4.         RemoveTreeNode m = new RemoveTreeNode();

  5.         TreeNode root = new TreeNode(1);
  6.         TreeNode n2 = new TreeNode(2);
  7.         TreeNode n3 = new TreeNode(3);
  8.         TreeNode n4 = new TreeNode(4);
  9.         TreeNode n5 = new TreeNode(5);
  10.         TreeNode n6 = new TreeNode(6);
  11.         TreeNode n7 = new TreeNode(7);
  12.         TreeNode n8 = new TreeNode(8);

  13.         root.left = n2;
  14.         root.right = n3;
  15.         n2.left = n4;
  16.         n2.right = n5;
  17.         n3.right = n6;
  18.         n6.left = n7;
  19.         n6.right = n8;

  20.         //            1
  21.         //         /     \
  22.         //        2       3
  23.         //       / \       \
  24.         //      4   5       6
  25.         //                 /  \
  26.         //                7   8


  27.         System.out.println("Preorder of original tree");
  28.         m.preOrder(root);
  29.         System.out.println();
  30.         System.out.println("------------------------");


  31.         System.out.println("After remove some nodes");
  32.         List<TreeNode> ans = m.removeTreeNode(root);
  33.         for(TreeNode node : ans){
  34.             m.preOrder(node);
  35.             System.out.println();
  36.             System.out.println("------------------------");
  37.         }
  38.     }

  39.     List<TreeNode> removeTreeNode(TreeNode root){
  40.         ArrayList<TreeNode> ans = new ArrayList<TreeNode>();
  41.         TreeNode pseudoNode = new TreeNode(-1);
  42.         //Because pseudoNode is created by us,
  43.         //it's impossible for removeAPI to remove this node
  44.         //We create pseudoNode just in case of that removeAPI may remove the root of the tree
  45.         pseudoNode.left = root;
  46.         DFS(pseudoNode,ans);
  47.         if(pseudoNode.left != null)
  48.             ans.add(pseudoNode.left);
  49.         return ans;
  50.     }

  51.     //the return value of DFS() means whether we want to remove the children or not
  52.     boolean DFS(TreeNode node, ArrayList<TreeNode> ans){
  53.         if(node == null)
  54.             return false;   //don't have to remove this node
  55.         boolean removeLeft = DFS(node.left,ans);
  56.         boolean removeRight = DFS(node.right,ans);
  57.         if(removeLeft)
  58.             node.left = null;
  59.         if(removeRight)
  60.             node.right = null;
  61.         if(removeAPI(node)){    //removeAPI says we have to remove this node
  62.             if(node.left != null)
  63.                 ans.add(node.left);
  64.             if(node.right != null)
  65.                 ans.add(node.right);
  66.             return true;    //remove this node
  67.         }
  68.         return false;   //removeAPI doesn't say we have to remove this node
  69.     }

  70.     //I use this function to simulate removeAPI
  71.     boolean removeAPI(TreeNode node){
  72.         //remove nodes whose values are 1, 3, 6
  73.         if( node.val == 1 || node.val == 3  || node.val == 6 )
  74.             return true;
  75.         return false;
  76.     }

  77.     void preOrder(TreeNode node){
  78.         if(node == null)
  79.             return;
  80.         System.out.print(node.val + " ");
  81.         preOrder(node.left);
  82.         preOrder(node.right);
  83.     }
  84. }

  85. class TreeNode{
  86.     int val;
  87.     TreeNode left;
  88.     TreeNode right;
  89.     TreeNode(int val){
  90.         this.val = val;
  91.     }
  92. }
复制代码
回复

使用道具 举报

推荐
tinylic 2018-3-27 03:04:56 | 只看该作者
全局:
lovedudu 发表于 2018-3-27 02:57
请问这道题目“你一个dictionary和一个word。让你找出这个word最长的substring,使得这个substring在dictio ...

可以参考蠡口妻舅儿

评分

参与人数 1大米 +3 收起 理由
lovedudu + 3 优秀!给你加米!

查看全部评分

回复

使用道具 举报

🔗
edyyy 2018-3-27 01:40:08 | 只看该作者
全局:
谢谢楼主分享,“不是CS专业”的能过狗家面试,还是很厉害的。!!

补充内容 (2018-3-27 01:52):
楼主match到哪个组了?
回复

使用道具 举报

🔗
lovedudu 2018-3-27 02:57:00 | 只看该作者
全局:
请问这道题目“你一个dictionary和一个word。让你找出这个word最长的substring,使得这个substring在dictionary中出现”楼主是什么思路呢?
回复

使用道具 举报

🔗
 楼主| jing_222 2018-3-27 03:45:41 | 只看该作者
全局:
edyyy 发表于 2018-3-27 01:40
谢谢楼主分享,“不是CS专业”的能过狗家面试,还是很厉害的。!!

补充内容 (2018-3-27 01:52):

我match到一个做信息提取和storage的组
回复

使用道具 举报

🔗
 楼主| jing_222 2018-3-27 03:49:01 | 只看该作者
全局:
lovedudu 发表于 2018-3-27 02:57
请问这道题目“你一个dictionary和一个word。让你找出这个word最长的substring,使得这个substring在dictio ...

我直接暴力recursion做了:如果word长度为n,那么先考虑长度为n-1的substring,再考虑n-2的,一直到1
复杂度O(2^n), 不过没法再优化了
回复

使用道具 举报

🔗
lovedudu 2018-3-27 05:00:20 | 只看该作者
全局:
jing_222 发表于 2018-3-27 03:49
我直接暴力recursion做了:如果word长度为n,那么先考虑长度为n-1的substring,再考虑n-2的,一直到1
复 ...

谢谢楼主!
回复

使用道具 举报

🔗
lf963 2018-3-27 10:48:16 | 只看该作者
全局:
第二题是给你一个dictionary和一个word。让你找出这个word最长的substring,使得这个substring在dictionary中出现。substring的意思是删除原word中任意数量字母之后,剩余的string。比如
dictionary = {inter, te, as, ads, innal}, word = "international", 那么这个substring就是 innal

請問是找 substring 還是 subsequence ? substring 應該是連續出現在 word 的 string,所以 innal 應該不是 substring,而是 subsequence
假如是找最長 subsequence 的話,為甚麼答案不能是 inter 呢? 它的長度和 innal 都一樣是5
回复

使用道具 举报

🔗
 楼主| jing_222 2018-3-28 03:17:28 | 只看该作者
全局:
lf963 发表于 2018-3-27 10:48
第二题是给你一个dictionary和一个word。让你找出这个word最长的substring,使得这个substring在dictionary ...

你说的对,是subsequence。inter也是对的~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表