一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

一亩三分地官方iOS手机应用下载
查看: 2998|回复: 13
收起左侧

FB跪经,疑似新题,我是没见过

[复制链接] |试试Instant~ |关注本帖
jialiu54321 发表于 2016-10-18 06:11:02 | 显示全部楼层 |阅读模式

2016(10-12月) 码农类 硕士 全职@Facebook - 内推 - 技术电面 在线笔试 |Failfresh grad应届毕业生

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

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

x
中国人面的,打了个招呼就开始做题,一共四十五分钟

就一道题:
remove as many edges as possible from a tree and the result trees all have even number of nodes

         o
  /    |   |   \
o     o   o    o
|      
o

比如可以删掉一个边变成:
         o
  x    |   |   \
o     o   o    o
|      
o
结果里有两个tree,分别有2个和四个node,符合条件,这就是答案,因为再删就不符合条件了
return是一个list,里面是所有新生成的tree的root

花了三十分钟没搞定,果断挂了

后来想想应该便利两次,
第一次记录所有以当前node为根的subtree的node总数
第二次就可以用这些数据切割树了

当时脑子糊住没想到

评分

1

查看全部评分

rinto 发表于 2016-10-18 09:12:05 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
修改了一下,可以跑楼主给的例子了。


  1. public class TreeNode{
  2.     int val;
  3.     List<TreeNode> subtree;
  4.     public TreeNode(int val){. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  5.         this.val = val;
  6.         subtree = new ArrayList<>();. 1point3acres.com/bbs
  7.     }

  8.     public void addChild(TreeNode child){
  9.         subtree.add(child); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  10.     }
  11. }

  12. public class BreakTree {
  13. . 鍥磋鎴戜滑@1point 3 acres
  14.     public List<TreeNode> breakTree(TreeNode root){
  15.         List<TreeNode> result = new ArrayList<>();
  16.         countAndBreak(result, root);
  17.         return result;
  18.     }

  19.     private int countAndBreak(List<TreeNode> result, TreeNode root){
  20.         if (root == null){
  21.             return 0;
  22.         } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

  23.         int count = 1;. Waral 鍗氬鏈夋洿澶氭枃绔,
  24.         Iterator<TreeNode> iter = root.subtree.iterator();
  25.         while (iter.hasNext()){
  26.             int childCount = countAndBreak(result, iter.next());
  27.             if (childCount == 0){
  28.                 iter.remove();
  29.             } else{
  30.                 count += childCount;
  31.             }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  32.         }
  33. . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  34.         if (count % 2 == 0){. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  35.             result.add(root);
  36.             return 0;. visit 1point3acres.com for more.
  37.         } else{
  38.             return count;
  39.         }
  40.     }


  41.     public static void main(String[] args){
  42.         TreeNode root = new TreeNode(0);

  43.         TreeNode firstChild = new TreeNode(1);
  44.         firstChild.addChild(new TreeNode(2));
  45.         root.addChild(firstChild); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

  46.         root.addChild(new TreeNode(3));
  47.         root.addChild(new TreeNode(4));
  48.         root.addChild(new TreeNode(5));

  49.         BreakTree soln = new BreakTree(); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  50.         List<TreeNode> result = soln.breakTree(root);. 1point3acres.com/bbs
  51.         System.out.println(result.size());. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  52.     } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  53. }
复制代码
回复 支持 2 反对 0

使用道具 举报

iPhD 发表于 2016-10-18 06:21:08 | 显示全部楼层
关注一亩三分地微博:
Warald
楼主运气好差。。摸摸。。。

这题的输入类型是什么?多叉树node吗?
回复 支持 反对

使用道具 举报

 楼主| jialiu54321 发表于 2016-10-18 06:23:28 | 显示全部楼层
iPhD 发表于 2016-10-18 06:21
楼主运气好差。。摸摸。。。

这题的输入类型是什么?多叉树node吗?

一个空白的编辑器,所有都要自己写,包括TreeNode,test case等等
回复 支持 反对

使用道具 举报

iPhD 发表于 2016-10-18 06:24:33 | 显示全部楼层
jialiu54321 发表于 2016-10-18 06:23
一个空白的编辑器,所有都要自己写,包括TreeNode,test case等等

楼主运气真好差。。。这国人大哥坑爹呀。。。
回复 支持 反对

使用道具 举报

yingy4 发表于 2016-10-18 06:44:23 | 显示全部楼层
这貌似是hackerrank的原题,https://www.hackerrank.com/challenges/even-tree
回复 支持 反对

使用道具 举报

yuanxiehuang 发表于 2016-10-18 07:13:28 | 显示全部楼层
public class TreeNode {
    public List<TreeNode> children;
    int count;//This variable means how many children node including itself under this node.

}
public List<TreeNode> removeEdges(TreeNode root) {
        List<TreeNode> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        recursiveRemvoe(root, result);
        return result;
    }

    private void recursiveRemvoe(TreeNode root, List<TreeNode> list) {
        if (root.children.size() == 0) {
            return;. from: 1point3acres.com/bbs
        }
        for (int i = 0; i < root.children.size(); i++) {
            TreeNode cur = root.children.get(i);
            if ((root.count - cur.count) % 2 == 0) {
                list.add(cur);
                root.count -= cur.count;
                recursiveRemvoe(cur, list);
            }
        }
    }

大家看看这样可以吗? 我自己粗略写了一下,请大家轻喷...
回复 支持 反对

使用道具 举报

rinto 发表于 2016-10-18 08:41:00 | 显示全部楼层
确实没见过这种题,很tricky啊,开始还以为要先把树转化成图来做,仔细看了一下输出要求仍然是树,估计面试遇到这个题往这个方向一想就崩了。。。patpat楼主

我是这么想的,对于一个root的每个子结点,可以递归的边count边把偶数个node的枝给切了(切掉的不算在count里),所以这个返回值肯定是奇数,如果所有这些剩下的点加上root正好是偶数个,root可以单独成树。大概的code如下

code现在有个bug,parent.subtree.remove(root); 会影响上一层recursive里面的 for (TreeNode node : root.subtree),可能扔出个concurrentmodificationexception。。可能mark一下再修改或者传个iterator把自己删了会好点

  1. . From 1point 3acres bbs
  2. public class BreakTree {
  3.     class TreeNode{
    . 1point 3acres 璁哄潧
  4.         int val;
  5.         List<TreeNode> subtree;
  6.         TreeNode(int val){
  7.             this.val = val;
  8.             subtree = new ArrayList<>();
  9.         }
  10.     }
  11.    
  12.    
  13.     public List<TreeNode> breakTree(TreeNode root){
  14.         List<TreeNode> result = new ArrayList<>();
  15.         countAndBreak(result, root, null);
  16.         return result;
  17.     }
  18.    
  19.     private int countAndBreak(List<TreeNode> result, TreeNode root, TreeNode parent){. From 1point 3acres bbs
  20.         if (root == null){ 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  21.             return 0;.1point3acres缃
  22.         }
  23.         
  24.         int count = 1;
  25.         for (TreeNode node : root.subtree){
  26.             count += countAndBreak(result, node, root);
  27.         }
  28.         
  29.         if (count % 2 == 0){
  30.             if (parent != null){
  31.                 parent.subtree.remove(root);. 1point 3acres 璁哄潧
  32.             }
  33.             result.add(root);
  34.             return 0;
  35.         } else{
  36.             return count;
  37.         }
  38.     }. 鍥磋鎴戜滑@1point 3 acres
  39. }-google 1point3acres
复制代码

回复 支持 反对

使用道具 举报

iPhD 发表于 2016-10-18 08:53:42 | 显示全部楼层
rinto 发表于 2016-10-18 08:41.1point3acres缃
确实没见过这种题,很tricky啊,开始还以为要先把树转化成图来做,仔细看了一下输出要求仍然是树,估计面试 ...
  1. public class EvenTree {. visit 1point3acres.com for more.

  2.     private Set<Integer>[] adj;
  3.     private boolean[] visited;
  4.     private int E;
  5.     private int V;
  6.     private int count;-google 1point3acres
  7.     private List<Integer> nodes;

  8.     public EvenTree(int E, int V) {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  9.         adj = new (HashSet<Integer>) Object[V];
  10.         visited = new boolean[V];
  11.         this.E = E;
  12.         this.V = V;
  13.         count = 0;
  14.         nodes = new ArrayList<Integer>();      . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  15.     }
  16. . 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  17.     public int dfs(int node) {
  18.         visit[node] = true;
  19.         int children = 0;

  20.         for (Integer v : adj[node]) {. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  21.             if (!visit[v]) {
  22.                 int num = dfs(v);
  23.                 if (num % 2 == 0) {
  24.                     count++;
  25.                 } else {
  26.                     children += num;
  27.                 }
  28.             } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  29.         }

  30.         if (children % 2 == 1) {
  31.             nodes.add(node);
  32.         }. From 1point 3acres bbs
  33.         
  34.         return children + 1;
  35.     }
  36. 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  37.     public static void main(String[] args) {
  38.         EvenTree et = new EvenTree(E, V);
  39.         for (int i = 0; i < E; i++) {
  40.             et.adj[v1].add(v2);
  41.             et.adj[v2].add(v1);.鏈枃鍘熷垱鑷1point3acres璁哄潧
  42.         }

  43.         et.dfs(0);
  44.     }

  45. }
复制代码
回复 支持 反对

使用道具 举报

yhatl 发表于 2016-10-18 09:26:32 | 显示全部楼层
遍历一遍 只要children有even个 就cut加入forest
回复 支持 反对

使用道具 举报

iPhD 发表于 2016-10-18 09:27:20 | 显示全部楼层
yhatl 发表于 2016-10-18 09:26
遍历一遍 只要children有even个 就cut加入forest

你能帮忙看下我贴的那个代码对不?
回复 支持 反对

使用道具 举报

yhatl 发表于 2016-10-18 09:38:41 | 显示全部楼层
iPhD 发表于 2016-10-18 09:27
你能帮忙看下我贴的那个代码对不?

不好意思,我用c++的,java看着太费劲了
不过这题和LC366差不多,所以便利一遍是够了
回复 支持 反对

使用道具 举报

whyvic13 发表于 2016-10-18 11:16:49 | 显示全部楼层
rinto 发表于 2016-10-18 09:12
修改了一下,可以跑楼主给的例子了。

        root
      /   |    \
    1     3    5. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
    |      |     |
    2      4    6

我也差不多这样写的,可是如果总node总数是奇数的话, 比如上面这种情况root就会变成一个单独的node并且怎么删都没法保证所有的子树是even number,所以这题的前提是node总数为偶数?
回复 支持 反对

使用道具 举报

wtcupup 发表于 2016-10-18 11:20:33 | 显示全部楼层
rinto 发表于 2016-10-18 09:12
修改了一下,可以跑楼主给的例子了。

请问为啥 iter.remove(); 是remove的edge 而不是 node本身?

补充内容 (2016-10-18 11:36):
懂了 层主简直是大牛
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

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

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2017-4-25 14:04

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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