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

Google电面挂经 + 求助

全局:

2016(1-3月) 码农类General 博士 全职@google - 内推 - 技术电面  | | Fail | 应届毕业生

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

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

x
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
  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
复制代码
电面具体结果:
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
(2016-3-29 08:15):
更准确地说不是weighted graph,只不过node的adj里面除了存node外,还要存一个ratio而以,所以为什么BFS就行,而不需要用bellman ford / dijkstra 之类的东西

补充内容 (2016-4-2 04:26):
今天HR告诉我加面,可能面试官没有fail我

上一篇:ebay 电面
下一篇:Twitter OA

本帖被以下淘专辑推荐:

  • · Google|主题: 54, 订阅: 46
推荐
omega094 2016-9-12 09:40:42 | 只看该作者
全局:
leetcode 399
ORZ...ORZ....ORZ
回复

使用道具 举报

推荐
ScottShao 2016-4-2 06:18:32 | 只看该作者
全局:
bless 楼主

我也觉得union find应该比较好做:
可以分成两步:
union:
需要三个数据结构:
Edge: src, dest, ratio
HashSet<Edge>:从点到其root的dest,key是src和dest
HashMap<Node, Set<Node>>:点和他的root集,因为某个点可能有很多root,比如说A——C,B——C,c的root就是a和b
然后复杂度是O(n^2)
find:
直接在HashSet里面找就可以,总复杂度是O(N)
回复

使用道具 举报

推荐
shisoft 2016-9-13 11:11:20 | 只看该作者
全局:
看了解释后直接写一次性跑通

  1.        public void addEdge(String sa, String sb, double val, Map<String, Map<String, Double>> graph) {
  2.             Map<String, Double> vertex = graph.get(sa);
  3.             if (vertex == null) {
  4.                 vertex = new HashMap<>();
  5.                 graph.put(sa, vertex);
  6.             }
  7.             vertex.put(sb, val);
  8.         }

  9.         public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {

  10.             Map<String, Map<String, Double>> graph = new HashMap<>();

  11.             for (int i  = 0; i < values.length; i++) {
  12.                 String[] syms = equations[i];
  13.                 String sym1 = syms[0];
  14.                 String sym2 = syms[1];
  15.                 addEdge(sym1, sym2, values[i], graph);
  16.                 addEdge(sym2, sym1, 1 / values[i], graph);
  17.             }


  18.             double[] rt = new double[queries.length];
  19.             for (int i = 0;i < queries.length; i++) {
  20.                 String[] syms = queries[i];
  21.                 String sym1 = syms[0];
  22.                 String sym2 = syms[1];
  23.                 Map<String, Double> vertexA = graph.get(sym1);
  24.                 rt[i] = -1;
  25.                 if (vertexA == null) {
  26.                     continue;
  27.                 }
  28.                 rt[i] = countRatio(graph, sym1, sym2, new HashSet<>());
  29.             }
  30.             return rt;
  31.         }

  32.         private double countRatio(Map<String, Map<String, Double>> graph, String syma, String symb, Set<String> visited) {
  33.             Map<String, Double> vertex = graph.get(syma);
  34.             visited.add(syma);
  35.             if (vertex == null) return -1;
  36.             if (syma.equals(symb)) return 1;
  37.             for (Map.Entry<String, Double> e : vertex.entrySet()) {
  38.                 String sb = e.getKey();
  39.                 Double ratio = e.getValue();
  40.                 if (!visited.contains(sb)) {
  41.                     double cr = countRatio(graph, sb, symb, visited);
  42.                     if (cr != -1) {
  43.                         double res = ratio * cr;
  44.                         if (visited.contains(symb)) return res;
  45.                     }
  46.                 }
  47.             }
  48.             return -1;
  49.         }
复制代码
回复

使用道具 举报

🔗
 楼主| user123456 2016-3-29 08:15:09 | 只看该作者
全局:
更准确地说不是weighted graph,只不过node的adj里面除了存node外,还要存一个ratio而以,所以为什么BFS就行,而不需要用bellman ford / dijkstra 之类的东西
回复

使用道具 举报

🔗
ruokua 2016-3-29 09:05:18 | 只看该作者
全局:
Map<Key1, Map<Key2, Ratio>> 没什么不对啊
这其实就是一个graph
Key 1 means start point
Key 2 means end point
ratio is cost of path

A -> B -> C -> A 这种情况 保留一个set 看 是否visit 过就可以了吗
回复

使用道具 举报

🔗
yuan311 2016-3-29 09:15:10 | 只看该作者
全局:
F2 需要的path在f1中一定存在吗?F1和F2的量级的差别有什么说法?
回复

使用道具 举报

🔗
 楼主| user123456 2016-3-29 09:15:48 | 只看该作者
全局:
ruokua 发表于 2016-3-29 09:05
Map 没什么不对啊
这其实就是一个graph
Key 1 means start point

具体就不知道了。我说这个说了半天,他后来让我换思路,于是就到了graph
回复

使用道具 举报

🔗
 楼主| user123456 2016-3-29 09:18:59 | 只看该作者
全局:
yuan311 发表于 2016-3-29 09:15
F2 需要的path在f1中一定存在吗?F1和F2的量级的差别有什么说法?

不一定存在,如果两个Node没有连接,他让在两个Node后面写x

量级的差别的话,我的理解是,在你遍历f2的过程中,需要不断给graph添加edge,这样越到后面,BFS的时候越快
回复

使用道具 举报

🔗
 楼主| user123456 2016-3-29 09:45:54 | 只看该作者
全局:
求助:这种情况怎么样向HR要求加面会增加被电面的可能性呢?
回复

使用道具 举报

🔗
dimi 2016-3-29 10:10:13 | 只看该作者
本楼:
全局:
题目好难
回复

使用道具 举报

🔗
waikai 2016-3-29 10:14:10 | 只看该作者
全局:
好详实的面经。谢谢lz。
我有一些其他思路,但没有具体码出来。先抛砖引玉了。
首先可以对f1做Union Find。比如在f1中,从A点出发可以到达的点都在UnionA中, 所以可以自己写一个数据结构。和楼主的

Map<Key1, Map<Key2, Ratio>>类似。A{A, 1}即A点在集合A中,到A的R是1。只要任意一点X也在集合A中我们在处理f1文件是就算出他到A的R。
所以处理f2时候,就不用BFS,而是直接看点是否在一个集合中。如果在则直接R * 1/R。所以时间复杂度为O(1)。如果不在一个集合中,就为X。
回复

使用道具 举报

🔗
houqingniao 2016-3-29 13:10:01 | 只看该作者
全局:
按照图这个搞,45分钟写完还真不容易。。。
不过就是用图,还是得用map
bless lz!
回复

使用道具 举报

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

本版积分规则

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