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

GoogleNYC跪经

全局:

2016(7-9月) 码农类General 本科 全职@google - Other - Onsite  | | Fail | 在职跳槽

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

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

x
上周一Google NYC面的,今天得知没有过HC。


第一轮: Print BST Kth level alternatively
比如  5 ,k = 2的话, 打印结果1 8 3 6
    /  \
   2    7
  / \  / \
  1 3 6  8
比如  5 ,k = 2的话, 打印结果3 8 6
    /  \
   2    7
    \  / \
    3 6  8
这道题虽然说是BST,但跟BST没啥关系。
一开始我没有很好的思路,然后面试官提示DFS/BFS,我就想到BFS+deque的做法:

  1. void printBSTKthLevelAlt(TreeNode *root, int k) {
  2.   if (root == nullptr || k < 0) {
  3.     return;
  4.   }
  5.   deque<TreeNode*> q;
  6.   int level = 0;
  7.   q.push_back(root);
  8.   while(!q.empty()) {
  9.     if (level == k) {
  10.       printLevel(q);
  11.       return;
  12.     }
  13.     auto ls = q.size();
  14.     for(auto i = 0; i < ls; ++i) {
  15.       auto node = q.front();
  16.       q.pop_front();
  17.       if (q->left != nullptr) {
  18.         q.push_back(q->left);
  19.       }
  20.       if (q->right != nullptr) {
  21.         q.push_back(q->right);
  22.       }
  23.     }
  24.     ++k;
  25.   }
  26. }

  27. void printLevel(const deque<TreeNode*>& q) {
  28.   bool left = true;
  29.   while (!q.empty()) {
  30.     TreeNode* node;
  31.     if (left) {
  32.       node = q.front();
  33.       q.pop_front();
  34.     }
  35.     else {
  36.       node = q.back();
  37.       q.pop_back();
  38.     }
  39.     cout << node->val << ' ';
  40.     left != left;
  41.   }
  42.   cout << endl;
  43. }
复制代码
然后面试官问我time&space complexity是什么,我答道O(n), O(2^k)。
然后他说怎么可以在保持time complexity的同时优化space。我就开始纠结了。
他提示说用DFS,我比划了半天也没想出来。然后时间快到的时候,他告诉了我他的思路:
维护两个stack,一个stack先push right child,另一个先push left child
比如我们有      a1                        这棵树,我们想打印k=3这层,
                 /            \
        a2             a3
          /    \        /      \
     a4    a5      a6      a7
    / \   /
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
们根本不需要原本的顺序,只要知道两个vector有哪些相同的indexes就好了。
而且面试官也没有说要再把我们的数据结构还原成sparse vector。赖我自己没有精确的理解面试官的意图。
然后面试官又问我如果是matrix的话,怎么表示。我这个时候又特别跳的说不知道可不可以用quardTtree。面试官微笑的说,因垂丝汀,用quardTree的话,space complexity是什么?我,。。。
不过也没有过多的询问我,最后让我用别的数据结构表示。我就告诉面试官类似的思路,不过是two d array。

面试官人都挺好的,交流的也都挺愉快的。除了第二轮外,感觉都是东欧人。
没有遇到难题,第二,三轮都挺水的。第一轮解决了问题,但follow up没有跟上面试官的逻辑。
整体上感觉自己题解虽然还可以,但还是面试经历太少,自己有点儿跳,板书也有点儿慢。
再接再厉吧。


补充内容 (2016-8-5 07:06):
第四轮代码
if (it1 == p_to_m_.end()) 和 if (it2 == p_to_m_.end())
里面有bug

评分

参与人数 4大米 +33 收起 理由
tobebeyond + 10 感谢分享!
muybienw + 10 感谢分享!
mnmunknown + 10 感谢分享!
forbread + 3 感谢分享!

查看全部评分


上一篇:Two Sigma 电面
下一篇:G家第一轮电面,5分钟前的新鲜狗粮_(:3TZ)_

本帖被以下淘专辑推荐:

推荐
hxtang 2016-8-8 21:52:22 | 只看该作者
全局:
chenqidi 发表于 2016-8-8 20:17
求问有代码实现吗?
  1. struct TreeNode {
  2.     int val;
  3.     TreeNode* left, * right;
  4.     TreeNode(int v) : val(v), left(NULL), right(NULL) {};
  5. };

  6. class TreeIterator {
  7. public:
  8.         TreeIterator(TreeNode* root, int k) : max_level(k) {
  9.                 if (root) stk.push(make_pair(0, root));
  10.         }
  11.        
  12.         bool has_next() { return !stk.empty(); }
  13.        
  14.         int next() {
  15.                 if (stk.empty()) throw "out of range";  
  16.                 int ret_val = stk.top().second->val;
  17.                 stk.pop();
  18.                 traverse();
  19.                 return ret_val;
  20.         };       
  21.        
  22.         virtual TreeNode* get_left (TreeNode *n)=0;
  23.         virtual TreeNode* get_right(TreeNode *n)=0;

  24. protected:       
  25.         void traverse() {
  26.                 while (!stk.empty() && stk.top().first != max_level) {
  27.                         int next_level = stk.top().first+1;
  28.                         TreeNode* left  = get_left (stk.top().second);
  29.                         TreeNode* right = get_right(stk.top().second);
  30.                         stk.pop();
  31.                         if (right) stk.push(make_pair(next_level, right));
  32.                         if (left)  stk.push(make_pair(next_level, left ));
  33.                 }               
  34.         }
  35.         stack<pair<int, TreeNode*>> stk;
  36.         int max_level;
  37.        
  38. };

  39. class TreeForwardIterator : public TreeIterator {
  40. public:
  41.     TreeForwardIterator(TreeNode* root, int k) : TreeIterator(root, k) { traverse(); };
  42.         TreeNode* get_left (TreeNode* n) { return n->left;  };
  43.         TreeNode* get_right(TreeNode* n) { return n->right; };
  44. };


  45. class TreeReverseIterator : public TreeIterator {
  46. public:
  47.     TreeReverseIterator(TreeNode* root, int k) : TreeIterator(root, k) { traverse(); };
  48.         TreeNode* get_left (TreeNode* n) { return n->right; };
  49.     TreeNode* get_right(TreeNode* n) { return n->left;  };       
  50. };

  51. vector<int> tree_level_alt(TreeNode *root, int k) {
  52.         TreeForwardIterator i_left (root, k);
  53.         TreeReverseIterator i_right(root, k);
  54.         vector<int> result;
  55.        
  56.         int l = INT_MIN, r = INT_MAX;
  57.         while (l < r){
  58.                 l = i_left.has_next()  ? i_left.next()  : INT_MAX;
  59.                 r = i_right.has_next() ? i_right.next() : INT_MIN;
  60.                 if (l < r) { result.push_back(l); result.push_back(r);}
  61.                 else { if (l == r) result.push_back(l); }
  62.         }
  63.         return result;
  64. };
复制代码

评分

参与人数 1大米 +5 收起 理由
tobebeyond + 5 感谢分享!

查看全部评分

回复

使用道具 举报

推荐
laiguojiuhao 2016-11-15 14:31:51 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
 楼主| dili7743 2016-8-5 08:24:05 | 只看该作者
全局:
第四轮可以用trie来代替hash table来节省空间,面试时也忘了提了
回复

使用道具 举报

🔗
bluepp 2016-8-5 22:53:11 | 只看该作者
全局:
1. 不是level order 遍历么?
回复

使用道具 举报

🔗
yiwen_15 2016-8-6 00:01:24 | 只看该作者
全局:
第一题我觉得你的思路更好啊
回复

使用道具 举报

🔗
 楼主| dili7743 2016-8-6 00:28:45 | 只看该作者
全局:
bluepp 发表于 2016-8-5 22:53
1. 不是level order 遍历么?

差不多,打印顺序不同
回复

使用道具 举报

🔗
hxtang 2016-8-6 01:36:55 | 只看该作者
全局:
第一题从空间complexity来说确实是他的小。stack就是前序遍历非递归算法那个stack,栈内元素照理说是不超过树的高度的k。但是BFS需要维护每层所有元素,空间上是2^k。
另外对DFS来说假设树是BST是有意义的。因为两个指针有可能会相互错过对方。BST可以用来判断终止条件(左指针指向的元素<右指针)。
回复

使用道具 举报

🔗
白羽幸 2016-8-6 01:40:24 | 只看该作者
全局:
第一题用dfs的话space complexity只有O(k)
回复

使用道具 举报

🔗
 楼主| dili7743 2016-8-6 02:52:39 | 只看该作者
全局:
hxtang 发表于 2016-8-6 01:36
第一题从空间complexity来说确实是他的小。stack就是前序遍历非递归算法那个stack,栈内元素照理说是不超过 ...

了解了,谢谢
回复

使用道具 举报

🔗
pushazhiniao 2016-8-6 03:17:20 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
YoYoqiekenow 2016-8-6 03:41:13 | 只看该作者
全局:
第四题,直接用hash table 存储每个名字的manager 不行吗? 这样不是每个功能都能实现?
回复

使用道具 举报

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

本版积分规则

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