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

Square第二轮电面 2015/10/1

全局:

2015(7-9月) 码农类General 本科 全职@square - 网上海投 - 技术电面  | | Pass | 应届毕业生

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

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

x
Square第二轮电面~

是写一个function, drop(double position, double size), 即从高处掉一个方块,左边的x坐标是position,方块的边长是size。然后它会一个个叠起
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
清楚了没有。

面试结束后1个小时就发来onsite邀请啦^_^

明天Google Onsite加油加油加油~~~!!!

上一篇:Amazon Group Interview
下一篇:ZocDoc onsite
全局:
Standard segment tree solution:

  1. #include <iostream>
  2. #include <vector>
  3. #include <assert.h>

  4. using namespace std;

  5. struct Node {
  6.     Node* left, *right;
  7.     int start, end, maxHei;
  8.     Node(int s, int e): start(s), end(e), maxHei(0), left(NULL), right(NULL) {}
  9. };

  10. class SegTree {
  11. public:
  12.     SegTree(int mr): minRange(1), maxRange(mr) {
  13.         root = build(minRange, maxRange); // Initialize a range with height 0.
  14.     }
  15.    
  16.     void drop(int position, int size) {
  17.         int start = position, end = position + size - 1;
  18.         int newHei = query(root, start, end) + size;
  19.         modify(root, start, end, newHei);
  20.     }
  21.    
  22.     int getHeight() {
  23.         return root->maxHei;
  24.     }
  25.    
  26. private:
  27.     Node* root;
  28.     int minRange, maxRange;
  29.    
  30.     Node* build(int start, int end) {
  31.         if(start > end) return NULL;
  32.         if(start == end) {
  33.             Node* newnode = new Node(start, start);
  34.             return newnode;
  35.         }
  36.         Node* node = new Node(start, end);
  37.         int mid = start + (end - start) / 2;
  38.         node->left = build(start, mid);
  39.         node->right = build(mid+1, end);
  40.         return node;
  41.     }
  42.    
  43.     int query(Node* node, int start, int end) {
  44.         if(!node) return INT_MIN;
  45.         if(node->start >= start && node->end <= end) return node->maxHei;
  46.         if(node->start > end || node->end < start) return INT_MIN;
  47.         return max(query(node->left, start, end), query(node->right, start, end));
  48.     }
  49.    
  50.     void modify(Node* node, int start, int end, int newHei) {
  51.         if(node->start > end || node->end < start) return;
  52.         if(node->start == node->end) {
  53.             node->maxHei = newHei;
  54.             return;
  55.         }
  56.         modify(node->left, start, end, newHei);
  57.         modify(node->right, start, end, newHei);
  58.         node->maxHei = max(node->left->maxHei, node->right->maxHei);
  59.     }
  60.    
  61. };

  62. int main(int argc, const char * argv[]) {
  63.     int maxRange = 10;
  64.     SegTree seg(maxRange);
  65.     seg.drop(1, 2);
  66.     seg.drop(5, 3);
  67.     assert(seg.getHeight() == 3);
  68.     seg.drop(2, 4);
  69.     assert(seg.getHeight() == 7);
  70.     seg.drop(8, 3);
  71.     assert(seg.getHeight() == 7);
  72.     seg.drop(1, 4);
  73.     assert(seg.getHeight() == 11);
  74.     seg.drop(7, 2);
  75.     return 0;
  76. }
复制代码
回复

使用道具 举报

推荐
fang5034012 2017-10-2 02:07:20 | 只看该作者
全局:
还没仔细学习线段树,自己先想了个方法来实现。基本思想就保存每次掉下来一个箱子之后他的start, end, 和height。然后根据height的高低来进行保存。从高往低,遍历每一个箱子。如果新掉下来的箱子start和end掉在某个箱子的位置范围内,就根据那个箱子的高度加上新的箱子的size得到新箱子的高度,然后保存。最后由于我们需要根据height来保存,所以要做一个排序。
时间复杂度有点高。drop是O(nlogn), getHeight是O(1)。自己写了一些test case跑了一下没发现问题。请大神帮忙看一下。如果有问题,请留言。谢谢
  1. class Solution:
  2.         def __init__(self):
  3.                 self.boxes = []

  4.         def drop(self, pos, size):
  5.                 start = pos
  6.                 end = pos + size
  7.                 if not self.boxes:
  8.                         self.boxes.append([start, end, size])
  9.                 else:
  10.                         for i in xrange(len(self.boxes)-1, -1, - 1):
  11.                                 s = self.boxes[i][0]
  12.                                 e = self.boxes[i][1]
  13.                                 h = self.boxes[i][2]
  14.                                 if s < start < e or s < end < e:
  15.                                         self.boxes.append([start, end, h + size])
  16.                                         break
  17.                                 if i == 0:
  18.                                         self.boxes.append([start, end, size])
  19.                 self.boxes.sort(key=lambda x: [x[2], x[0], x[1]])

  20.         def getHeight(self):
  21.                 if not self.boxes:
  22.                         return 0
  23.                 return self.boxes[-1][2]

  24. s = Solution()
  25. s.drop(1, 4)
  26. s.drop(2, 3)
  27. s.drop(1,1)
  28. s.drop(6,10)
  29. s.drop(10, 1)
  30. print(s.getHeight())
复制代码


回复

使用道具 举报

推荐
kelong 2016-2-22 11:32:43 | 只看该作者
全局:
这个题是比较典型的线段树(segment tree)。一种解法是:
1. define Node { double x1, x2, h },即代表X轴上坐标x1到x2之间能够遇到的最大高度为h
2. 每次来一个方块,设x坐标范围为(a, b),高度ht, 那么查找segment tree,得到(a, b)之间最大高度,设为H,则(a,b)区间的新高度需要变成(H+ht)
3. 更新segment tree,使(a, b)区间新高度为(H+ht):从根节点开始遍历,
    1)如果cur_node的(x1,x2)完全包括了(a,b)
          1) cur_node.h = (H+ht)
          2) 如果cur_node有子节点, 递归更新子节点
    2) 如果(x1, x2)跟(a,b)部分重合,假设 a < x1 < b < x2:
           1)生成一个新节点,范围:(a,x2)
           2)新节点left_child生成新节点, 范围(a,x1),right_child = cur_node (范围为x1-x2)
           3) 递归更新cur_node, 但范围从开始的(a,b)变成了(x1,b)

如此即可。
回复

使用道具 举报

🔗
f1371342385 2015-10-2 10:53:51 | 只看该作者
全局:
LZ是用Map<Integer, Set<Integer>>这样的map来做的?
回复

使用道具 举报

🔗
 楼主| Yunying 2015-10-2 11:02:09 | 只看该作者
全局:
f1371342385 发表于 2015-10-2 10:53
LZ是用Map这样的map来做的?

木有~就map<double, double>。跟Skyline有点像,就是记录高度变化的节点们~
回复

使用道具 举报

🔗
f1371342385 2015-10-2 11:09:16 | 只看该作者
全局:
Yunying 发表于 2015-10-2 11:02
木有~就map。跟Skyline有点像,就是记录高度变化的节点们~

好的,感谢LZ哈
回复

使用道具 举报

🔗
hanchen999 2015-10-2 13:16:53 | 只看该作者
全局:
正整数还好,double感觉好难啊,我怎么觉得应该用interval来做。。
回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
obama555 2015-10-3 03:11:00 | 只看该作者
全局:
请问楼主,Square的电面每个人都是两轮吗?有没有第二轮和第一轮的表现有关吗?小弟上周刚面了第一轮,面完不到一小时就HR就发邮件问第二次电面的availability,下周要面第二轮。问一下,有第二轮说明第一轮过关了吗?还是说所有人都有第二轮?
回复

使用道具 举报

🔗
 楼主| Yunying 2015-10-3 12:13:24 | 只看该作者
全局:
obama555 发表于 2015-10-3 03:11
请问楼主,Square的电面每个人都是两轮吗?有没有第二轮和第一轮的表现有关吗?小弟上周刚面了第一轮,面完 ...

有第二轮当然是第一轮过关了啊。。。不过也没什么差吧。。。
回复

使用道具 举报

🔗
obama555 2015-10-3 12:23:30 | 只看该作者
全局:
Yunying 发表于 2015-10-3 12:13
有第二轮当然是第一轮过关了啊。。。不过也没什么差吧。。。

大大地不一样有,如果所有人都有第二轮,那就不能因为有第二轮就认为第一轮过关,万一第一轮没过关就给第二轮,那无论第二轮面的多好都是fail,太伤感情了,花了时间不得好果子吃
回复

使用道具 举报

🔗
cjqhenry 2015-10-3 12:41:53 | 只看该作者
全局:
obama555 发表于 2015-10-3 12:23
大大地不一样有,如果所有人都有第二轮,那就不能因为有第二轮就认为第一轮过关,万一第一轮没过关就给第 ...

应该是过了第一轮才有第二轮,反正不管怎么样,都得好好面啊。 加油!
回复

使用道具 举报

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

本版积分规则

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