📣 独立日限时特惠: VIP通行证立减$68
回复: 21
跳转到指定楼层
上一主题 下一主题
收起左侧

狗家电面

全局:

2018(4-6月) 码农类General 硕士 全职@google - 内推 - 技术电面  | | Other | 应届毕业生

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

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

x
朋友内推,2/28电面。一个国人大哥,没有问其他,直接上题。给一个二叉树,随机改变每个node的位置,新的树结构不变,要保证每个node跟以前的该位置node不一样,不能直接更换n
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
好。应该是跪了,机会就这么浪费了。
题没刷多少,不知道地里有没有人见过这个,大家可以讨论下。

评分

参与人数 2大米 +8 收起 理由
yoyou1988 + 5 很有用的信息!
cexq + 3 很有用的信息!

查看全部评分


上一篇:求UW西雅图的school visit day面经
下一篇:想问下今年排名一般学校(例如70+)的CS master能拿到大公司的面试吗
推荐
littledog 2018-3-28 07:18:44 | 只看该作者
全局:
感觉就是建一个tree node wrapper node把原节点包进去,然后遍历原树通过wrapper把原来树的结构记录下来,然后第二次遍历wrapper tree就不需要原来的树的信息了,随机取一个当前可用的节点然后重新分配左右子节点。
  1. private class WrapperNode {
  2.         TreeNode node;
  3.         WrapperNode left;
  4.         WrapperNode right;

  5.         public WrapperNode(TreeNode node) {
  6.             this.node = node;
  7.             this.left = null;
  8.             this.right = null;
  9.         }
  10.     }


  11.     public TreeNode shuffleTreeNodes(TreeNode root) {
  12.         List<TreeNode> list = new ArrayList<>();
  13.         WrapperNode wroot = buildWrapperTree(root, list);
  14.         Collections.shuffle(list);
  15.         return shuffleTree(wroot, list.iterator());
  16.     }

  17.     private WrapperNode buildWrapperTree(TreeNode root, List<TreeNode> list) {
  18.         if (root == null) {
  19.             return null;
  20.         }
  21.         WrapperNode wroot = new WrapperNode(root);
  22.         list.add(root);
  23.         WrapperNode left = buildWrapperTree(root.left, list);
  24.         WrapperNode right = buildWrapperTree(root.right, list);
  25.         wroot.left = left;
  26.         wroot.right = right;
  27.         return wroot;
  28.     }

  29.     private TreeNode shuffleTree(WrapperNode wroot, Iterator<TreeNode> it) {
  30.         if (wroot == null) {
  31.             return null;
  32.         }
  33.         TreeNode left = shuffleTree(wroot.left, it);
  34.         TreeNode right = shuffleTree(wroot.right, it);
  35.         TreeNode root = it.next();
  36.         root.left = left;
  37.         root.right = right;
  38.         return root;
  39.     }
复制代码
回复

使用道具 举报

推荐
qaert 2018-11-8 13:38:14 | 只看该作者
全局:
littledog 发表于 2018-3-28 07:18
感觉就是建一个tree node wrapper node把原节点包进去,然后遍历原树通过wrapper把原来树的结构记录下来, ...

为什么要新建一个wrapper node 类呢?用原treenode 也可以做吧?跑了一下感觉差不多
  1. class Solution {
  2.     public TreeNode shuffleTreeNodes(TreeNode root) {
  3.         List<TreeNode> list = new ArrayList<>();
  4.         // 建一棵与原树结构完全一样的树
  5.         TreeNode structureRoot = buildStructure(root, list);
  6.         Collections.shuffle(list);
  7.         // 用原结点按照结构树重构一棵树
  8.         return shuffleTree(structureRoot, list.iterator());
  9.     }

  10.     private TreeNode buildStructure(TreeNode root, List<TreeNode> list) {
  11.         if (root == null) {
  12.             return null;
  13.         }
  14.         
  15.         list.add(root);
  16.         TreeNode structureRoot = new TreeNode(-1);
  17.         structureRoot.left = buildStructure(root.left, list);
  18.         structureRoot.right = buildStructure(root.right, list);
  19.         return structureRoot;
  20.     }

  21.     private TreeNode shuffleTree(TreeNode structureRoot, Iterator<TreeNode> it) {
  22.         if (structureRoot == null) {
  23.             return null;
  24.         }
  25.         
  26.         TreeNode root = it.next();
  27.         root.left = shuffleTree(structureRoot.left, it);
  28.         root.right = shuffleTree(structureRoot.right, it);
  29.         return root;
  30.     }
  31. }
复制代码
回复

使用道具 举报

🔗
buranmilk4 2018-3-3 01:13:09 | 只看该作者
全局:
感谢,但是不是很明白怎么样个随机法
回复

使用道具 举报

🔗
billb 2018-3-3 01:31:31 | 只看该作者
全局:
这个题肯定没有要求inpalce吧
回复

使用道具 举报

🔗
 楼主| dadadaxian 2018-3-3 01:35:08 | 只看该作者
全局:
buranmilk4 发表于 2018-3-3 01:13
感谢,但是不是很明白怎么样个随机法

这个要自己来设计,需保证每个Node跟原来的不一样,随机的意思就是运行了这个程序多次,但每次的结果可能是不一样的。
回复

使用道具 举报

🔗
 楼主| dadadaxian 2018-3-3 01:44:45 | 只看该作者
全局:
billb 发表于 2018-3-3 01:31
这个题肯定没有要求inpalce吧

没有。我那时候的思路是pre order出来每个node,针对每个node的左右孩子,随机找到后面的一个node的孩子交换。针对叶子节点特殊处理下。不过感觉跟面试官不是一个思路。
回复

使用道具 举报

🔗
yzkst06100 2018-3-3 02:18:07 | 只看该作者
全局:
binary tree 有pre order 和in order一起就能决定一棵树的结构,可以吧preorder 和in order 存下来。确定subtree 的range 然后shuffle 重新构建树。
回复

使用道具 举报

🔗
橙小夕 2018-3-3 08:35:39 | 只看该作者
全局:
yzkst06100 发表于 2018-3-3 02:18
binary tree 有pre order 和in order一起就能决定一棵树的结构,可以吧preorder 和in order 存下来。确定su ...

我觉得可以用post order读然后用pre order存就可以了
回复

使用道具 举报

🔗
cexq 2018-3-3 14:19:06 | 只看该作者
全局:
deserize and reshuffe?
回复

使用道具 举报

🔗
ladyM1896 2018-3-4 03:14:46 | 只看该作者
全局:
我的in-place思路:
1. 先用中序遍历把所有原树的值记在一个数组里
2. 把这个array shuffle
3. 重新对原树进行中序遍历,依次填入shuffle后的值
回复

使用道具 举报

全局:
我觉得你是不是对题意有些误解,不能换node里面的值,要直接换node,听起来就怪怪的。
回复

使用道具 举报

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

本版积分规则

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