一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 1392|回复: 14
收起左侧

求教一道脸书面经题

[复制链接] |试试Instant~ |关注本帖
oldman09 发表于 2017-6-23 06:37:07 | 显示全部楼层 |阅读模式

2017(4-6月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 |Other在职跳槽

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

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
  1. class User {
  2.    String name;
  3.    List<User> friends;
  4.    User(String name, List<User> friends) {-google 1point3acres
  5.       this.name = name;
  6.       this.friends = friends;
  7.    }
  8. }

  9. User copy(User u) {
  10. // implementation here...
  11. }
复制代码
如题,有一个user class,实现method deep copy 一个 user。注意环, 例如 b 是 a friend, c 是 b friend, a 是 c friend. 代码具体应该如何实现?


补充内容 (2017-6-23 06:41):
应该就是deep copy graph from root node,但是可以有环,应该怎么处理?

本帖被以下淘专辑推荐:

Linzertorte 发表于 2017-6-23 08:46:35 | 显示全部楼层
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <string>. 鍥磋鎴戜滑@1point 3 acres
  5. using namespace std;
  6. class User {
  7. public:
  8.     string name;
  9.     vector<User*> friends;
  10.     User(string name) {
  11.         this->name = name;
  12.     }
  13. };
  14. User *copy(User *u,unordered_map<User*, User*>& mp) {
  15.     if(mp.count(u)) return mp[u]; // alreay grey (in dfs path) or black
  16.    
  17.     // color grey
  18.     mp[u] = new User(u->name+" copy");
  19.     for(auto x:u->friends){
  20.         mp[u]->friends.push_back(copy(x,mp));
  21.     }
  22.     return mp[u];
  23.    
  24.     //color black
  25. }
  26. int main(int argc, const char * argv[]) {
  27.     User* a = new User("a");
  28.     User* b = new User("b");. 鍥磋鎴戜滑@1point 3 acres
  29.     User* c = new User("c");.1point3acres缃
  30.     a->friends.push_back(b);
  31.     b->friends.push_back(c);
  32.     c->friends.push_back(a);
  33.     unordered_map<User*, User*> mp; // user to user copy map "a"->"a copy"
  34.     User* a_copy = copy(a,mp);
    -google 1point3acres
  35.     cout<<a_copy->name<<endl;
  36.     cout<<a_copy->friends[0]->name<<endl;
  37.     cout<<a_copy->friends[0]->friends[0]->name<<endl;
  38.     . 1point 3acres 璁哄潧
  39.     return 0;
  40. }
复制代码


a copy
b copy.1point3acres缃
c copy
Program ended with exit code: 0
回复 支持 1 反对 0

使用道具 举报

edyyy 发表于 2017-6-23 06:52:16 | 显示全部楼层
一样用hash记录哪些已经copy了?
回复 支持 反对

使用道具 举报

33847682 发表于 2017-6-23 06:57:28 | 显示全部楼层
这题坑的地方是不是要重写equal和hashcode函数?
回复 支持 反对

使用道具 举报

 楼主| oldman09 发表于 2017-6-23 06:59:34 | 显示全部楼层
33847682 发表于 2017-6-23 06:57. From 1point 3acres bbs
这题坑的地方是不是要重写equal和hashcode函数?

我也是一头雾水,但是目前知道的信息只有这么多
回复 支持 反对

使用道具 举报

 楼主| oldman09 发表于 2017-6-23 07:01:23 | 显示全部楼层
edyyy 发表于 2017-6-23 06:52
一样用hash记录哪些已经copy了?

比如说你在copy a,dfs到c,发现有一个friend a,此时a 还没有entry 在map,怎么办呢?
回复 支持 反对

使用道具 举报

Linzertorte 发表于 2017-6-23 08:18:25 | 显示全部楼层
dfs的染色可以染三种啊,白,灰,黑, 灰就代表还在dfs路径上。。你这种情况下,只要是灰,你就放着map里唄,反正也是指针。(java里是reference)
回复 支持 反对

使用道具 举报

FightOn 发表于 2017-6-23 08:18:48 | 显示全部楼层
用hashmap, oldNode -> newNode, 有环(keyset里面有当前node)就continue
回复 支持 反对

使用道具 举报

ftfotroy 发表于 2017-6-23 10:53:23 | 显示全部楼层
FightOn 发表于 2017-6-23 08:18
用hashmap, oldNode -> newNode, 有环(keyset里面有当前node)就continue
.1point3acres缃
赞username,一家人 哈哈
回复 支持 反对

使用道具 举报

scredwood 发表于 2017-6-27 11:40:18 | 显示全部楼层
有环不也还是 LC 上的 clone graph吗?  没区别啊。
回复 支持 反对

使用道具 举报

youziwry 发表于 2017-6-27 11:58:10 | 显示全部楼层
oldman09 发表于 2017-6-23 07:01
比如说你在copy a,dfs到c,发现有一个friend a,此时a 还没有entry 在map,怎么办呢?

a的值copy完后 立刻存进hashmap,之后再去copy friends list 这样之后绕回a的时候就能发现a已经在map里了
回复 支持 反对

使用道具 举报

scredwood 发表于 2017-6-27 12:03:40 | 显示全部楼层
youziwry 发表于 2017-6-27 11:58
a的值copy完后 立刻存进hashmap,之后再去copy friends list 这样之后绕回a的时候就能发现a已经在map里了

public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
    if (node == null) return null;. from: 1point3acres.com/bbs
    if (map.containsKey(node)) return map.get(node);.鐣欏璁哄潧-涓浜-涓夊垎鍦
    UndirectedGraphNode copy = new UndirectedGraphNode(node.label);
    map.put(node, copy);
    for (UndirectedGraphNode n : node.neighbors)
        copy.neighbors.add(cloneGraph(n));
    return copy;
}

. 鍥磋鎴戜滑@1point 3 acres这样就好了。仔细过一遍,环根本不是问题。
回复 支持 反对

使用道具 举报

moonyellow 发表于 2017-7-9 05:53:42 | 显示全部楼层
解法是不是可以参考clone graph?
回复 支持 反对

使用道具 举报

chenqidi 发表于 2017-7-9 22:13:58 | 显示全部楼层
感觉就可以用clone graph来解啊
回复 支持 反对

使用道具 举报

byrlhb 发表于 2017-7-9 22:21:28 | 显示全部楼层
deep copy graph from root node也会有circle,但是并不影响
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-12-14 23:27

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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