由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 上个题大家给评评 (G家的)
相关主题
最近没有什么新题请问怎样写没有parent pointer的BST iterator?
谁有较好的iterative后序遍历binary tree的代码?Google Front-end Software Engineer Phone Interview
转一些我blog上一些常见的二叉树面试问题和总结bloomberg onsite题
树 inorder下个节点最好办法是啥How to find the kth biggest number in a BST
这种解法对吗?merge two BSTLowest common ancestor of two nodes of Binary Tree
interval tree vs. merge intervals在版上看到的G题
哪个高手能指出我程序的问题 (20几行的代码)BST 找重复节点数
Google电面recovery BST 不考虑相同值的情况么?
相关话题的讨论汇总
话题: node话题: int话题: list话题: span话题: end
进入JobHunting版参与讨论
1 (共1页)
p*****2
发帖数: 21240
1
我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
简洁的算法。
一个span array, 比如{(3,5),(7,16), (23,78)...}
然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
当时没听明白,以为是两个array, 做到一半的时候才搞明白。
这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
struct Node
{
int start;
int end;
}
后来编程的时候为了方便改成了class
class Node
{
int start;
int end;
Node(int s, int e)
{}
}
因为我主要是用C的,所以稍微有些措手不及。大家看看用C能有比较简洁的code吗?即
使用C#,我code写的也不好。大家帮我看看怎么改进。大概我写的是这样的
List Merge(List list, Node node)
{
List output;
int start=-1; //assume input are all positive numbers
int end=-1;
for(int i=0;i {
if(start==-1)
{
if(list[i].endstart)
output.Add(list[i]);
else
{
start=min(list[i].start,node->start);
end=max(list[i].end,node->end);
}
}
else
{
if(list[i].start>end)
{
output.Add(new Node(start,end));
output.Add(list[i]);
start=-1;end=-1;
}
else
{
end=max(list[i].end,end);
output.Add(new Node(start,end));
start=-1;end=-1;
}
}
}
if(start!=-1) //this was a bug pointed out by interviewer
output.Add(new Node(start,end));
if(list[i-1].end output.Add(node);
return output;
}
S**N
发帖数: 182
2
不太明白
这个例子的输出应该是什么 谢谢

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

p*****2
发帖数: 21240
3

比如
{(3,5),(7,16), (23,78)}
(10,19)
输出
{(3,5),(7,19),(23,78)}

【在 S**N 的大作中提到】
: 不太明白
: 这个例子的输出应该是什么 谢谢

S**N
发帖数: 182
4
那如果是 {(3,5),(7,16), (23,78)}
(19,22)
输出应该是什么?
谢谢

【在 p*****2 的大作中提到】
:
: 比如
: {(3,5),(7,16), (23,78)}
: (10,19)
: 输出
: {(3,5),(7,19),(23,78)}

p*****2
发帖数: 21240
5

{(3,5),(7,16),(19,22),(23,78)}

【在 S**N 的大作中提到】
: 那如果是 {(3,5),(7,16), (23,78)}
: (19,22)
: 输出应该是什么?
: 谢谢

p*****2
发帖数: 21240
6

你这么一说我code里还有bug

【在 S**N 的大作中提到】
: 那如果是 {(3,5),(7,16), (23,78)}
: (19,22)
: 输出应该是什么?
: 谢谢

b*****c
发帖数: 1103
7
输出
(3,5),(7,16), (19,78)
b*****c
发帖数: 1103
8
22,23是连续的咯,合并咯
p*****2
发帖数: 21240
9

靠。这题我问题太多了。

【在 b*****c 的大作中提到】
: 22,23是连续的咯,合并咯
p*****2
发帖数: 21240
10

你不说我一直没注意这点。

【在 b*****c 的大作中提到】
: 22,23是连续的咯,合并咯
相关主题
interval tree vs. merge intervals请问怎样写没有parent pointer的BST iterator?
哪个高手能指出我程序的问题 (20几行的代码)Google Front-end Software Engineer Phone Interview
Google电面bloomberg onsite题
进入JobHunting版参与讨论
w****x
发帖数: 2483
11
先对起点排序,排好了用下面的函数
void PrintMerge2(int a[], int n)
{
assert(a && n > 0 && n%2 == 0);
int nBeg = a[0];
int nEnd = a[1];
for (int i = 2; i < n; i += 2)
{
if (a[i] > nEnd)
{
cout< nBeg = a[i];
nEnd = a[i+1];
}
else
{
if (a[i+1] > nEnd)
nEnd = a[i+1];
}
}
cout< }
p*****2
发帖数: 21240
12
这个interviewer在我写code的时候一直低头在laptop上貌似工作。我写一段想给他解
释一下,不见他抬头。最后只能一气写完,他抓了个bug就结束面试了。刚开始以为很
简单的题,后来越写code越乱。尤其是不得不转用C#写。
b*****c
发帖数: 1103
13
也没啥的,事后再重新写一下,很多interviewer都会抄下你的代码供committee看
p*****2
发帖数: 21240
14

你觉得这题用C好搞吗?最怕面C碰到Java程序员。上次面A也碰到这么一个。

【在 b*****c 的大作中提到】
: 也没啥的,事后再重新写一下,很多interviewer都会抄下你的代码供committee看
b*****c
发帖数: 1103
15
list (list span_lis, Node & span)
{
if (span_lis==NULL) return NULL;
list::iterator iter=span_lis.begin();
while (iter!=span_lis.end())
{
if ((*iter).second>=span.first-1)
{
(*iter).first=min((*iter).first,span.first);
(*iter).second=max((*iter).second,span.second);
while (++iter !=span_lis.end())
{
if ((*iter).first>*boost::prior(iter).second+1)
{
break;
}
else
if ((*iter).second>*boost::prior(iter).second)
{
*boost::prior(iter).second=(*iter).second;
span_lis.erase(iter--);
break;
}
else
{
span_lis.erase(iter--);
}
}
return span_lis;

}
iter++;
}
span_lis.push_back(span);
return span_lis;
}
s******n
发帖数: 3946
16
不一定吧, 看成浮点就不用合并22,23

【在 p*****2 的大作中提到】
:
: 你觉得这题用C好搞吗?最怕面C碰到Java程序员。上次面A也碰到这么一个。

q****x
发帖数: 7404
17
algorithm: interval tree
coding: sort, binary search, sequential search.

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

z****u
发帖数: 104
18
这个应该就是一个 BST 的变种吧
按照 span 的 begin 值建立 BST
每次插入一个新的 span 的时候,如果这个span的 begin 值在某个 node 的范围之内
,合并,否则就是按照 BST 的规则进行插入
值得注意的是,合并的时候,需要判断合并后的 span 跟它的右儿子有没有相交,有的
话,继续合并,然后删除右儿子
p*****2
发帖数: 21240
19

删除右儿子用C操作起来还是有点麻烦。不过也还过得去。一会儿练练。这么看来这道
题出的也不算过分。用C的时候最后把后边的span往前移一下就可以了。

【在 z****u 的大作中提到】
: 这个应该就是一个 BST 的变种吧
: 按照 span 的 begin 值建立 BST
: 每次插入一个新的 span 的时候,如果这个span的 begin 值在某个 node 的范围之内
: ,合并,否则就是按照 BST 的规则进行插入
: 值得注意的是,合并的时候,需要判断合并后的 span 跟它的右儿子有没有相交,有的
: 话,继续合并,然后删除右儿子

p*****2
发帖数: 21240
20
再问个问题
recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
后再improve。这算不是误导呀?
相关主题
How to find the kth biggest number in a BSTBST 找重复节点数
Lowest common ancestor of two nodes of Binary Treerecovery BST 不考虑相同值的情况么?
在版上看到的G题一道C面试题
进入JobHunting版参与讨论
A**u
发帖数: 2458
21
没有误导你啊
这题目写起来也麻烦呢

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

n*******w
发帖数: 687
22
这个是正确的方向。一时找不出最优解,先brute force都行。你多点时间考虑或者实
现过程中能找到思路。
这个题应该不是语言的问题。用c或java基本也没差太多。
但是感觉你有些不清晰的地方。list用array还是linkedlist;合并的时候只要比较end
就行了,(start是先排好序的)这个逻辑要清晰。
interval的问题算是面试中比较繁琐的问题。

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

A**u
发帖数: 2458
23
你这也太夸张了
bst都用上了
得自己写一个bst?
面试来说,是不是太麻烦了

【在 z****u 的大作中提到】
: 这个应该就是一个 BST 的变种吧
: 按照 span 的 begin 值建立 BST
: 每次插入一个新的 span 的时候,如果这个span的 begin 值在某个 node 的范围之内
: ,合并,否则就是按照 BST 的规则进行插入
: 值得注意的是,合并的时候,需要判断合并后的 span 跟它的右儿子有没有相交,有的
: 话,继续合并,然后删除右儿子

n*******w
发帖数: 687
24
不麻烦的。用bst存interval,写递归。
跟树的遍历很类似。比预想简单的多。
只是直接用数组已经足够了。按start sort。

【在 A**u 的大作中提到】
: 你这也太夸张了
: bst都用上了
: 得自己写一个bst?
: 面试来说,是不是太麻烦了

s******n
发帖数: 3946
25
数组需要sort吗?题目里好像已经排序好了。
s******n
发帖数: 3946
26
数组需要sort吗?题目里好像已经排序好了。
y***d
发帖数: 2330
27
用 c 也不烦,想得太复杂了
newSpan=(10,19)
for each span in list
if overlap with newSpan
merge into newSpan
else
print span
print newSpan
这是没有 sort 的情况。

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

q****x
发帖数: 7404
28
如果不用区间树,那排序数组更简单。

【在 n*******w 的大作中提到】
: 不麻烦的。用bst存interval,写递归。
: 跟树的遍历很类似。比预想简单的多。
: 只是直接用数组已经足够了。按start sort。

a********m
发帖数: 15480
29
不算。过程比结果更重要。

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

p*****2
发帖数: 21240
30

可是他一直在搞电脑都不抬头看我呀。所以没啥过程了。

【在 a********m 的大作中提到】
: 不算。过程比结果更重要。
相关主题
贡献G电 估计挂了谁有较好的iterative后序遍历binary tree的代码?
Uber 面经转一些我blog上一些常见的二叉树面试问题和总结
最近没有什么新题树 inorder下个节点最好办法是啥
进入JobHunting版参与讨论
a********m
发帖数: 15480
31
"think loudly". 边写边说很重要。你写白伴的时候他们需要记录所有的代码,跟上你
的思路,也很忙的。

【在 p*****2 的大作中提到】
:
: 可是他一直在搞电脑都不抬头看我呀。所以没啥过程了。

g***x
发帖数: 494
32
这个好,但好像还少了点,merge 了 newspan之后,span i的end可能变化和i+1有重叠
,又要merge

【在 y***d 的大作中提到】
: 用 c 也不烦,想得太复杂了
: newSpan=(10,19)
: for each span in list
: if overlap with newSpan
: merge into newSpan
: else
: print span
: print newSpan
: 这是没有 sort 的情况。

p*****2
发帖数: 21240
33
今天用C#写了一遍,还是挺麻烦的。
f*******t
发帖数: 7549
34
我以前写过一个程序,用linked list存interval,按起始位置排序,各线段不重叠。
要往里插入新的节点相当不好写对,有多种情况和边界条件。
interval tree概念是不复杂,面试中基本没可能写出来。
p*****2
发帖数: 21240
35
我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
简洁的算法。
一个span array, 比如{(3,5),(7,16), (23,78)...}
然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
当时没听明白,以为是两个array, 做到一半的时候才搞明白。
这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
struct Node
{
int start;
int end;
}
后来编程的时候为了方便改成了class
class Node
{
int start;
int end;
Node(int s, int e)
{}
}
因为我主要是用C的,所以稍微有些措手不及。大家看看用C能有比较简洁的code吗?即
使用C#,我code写的也不好。大家帮我看看怎么改进。大概我写的是这样的
List Merge(List list, Node node)
{
List output;
int start=-1; //assume input are all positive numbers
int end=-1;
for(int i=0;i {
if(start==-1)
{
if(list[i].endstart)
output.Add(list[i]);
else
{
start=min(list[i].start,node->start);
end=max(list[i].end,node->end);
}
}
else
{
if(list[i].start>end)
{
output.Add(new Node(start,end));
output.Add(list[i]);
start=-1;end=-1;
}
else
{
end=max(list[i].end,end);
output.Add(new Node(start,end));
start=-1;end=-1;
}
}
}
if(start!=-1) //this was a bug pointed out by interviewer
output.Add(new Node(start,end));
if(list[i-1].end output.Add(node);
return output;
}
S**N
发帖数: 182
36
不太明白
这个例子的输出应该是什么 谢谢

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

p*****2
发帖数: 21240
37

比如
{(3,5),(7,16), (23,78)}
(10,19)
输出
{(3,5),(7,19),(23,78)}

【在 S**N 的大作中提到】
: 不太明白
: 这个例子的输出应该是什么 谢谢

S**N
发帖数: 182
38
那如果是 {(3,5),(7,16), (23,78)}
(19,22)
输出应该是什么?
谢谢

【在 p*****2 的大作中提到】
:
: 比如
: {(3,5),(7,16), (23,78)}
: (10,19)
: 输出
: {(3,5),(7,19),(23,78)}

p*****2
发帖数: 21240
39

{(3,5),(7,16),(19,22),(23,78)}

【在 S**N 的大作中提到】
: 那如果是 {(3,5),(7,16), (23,78)}
: (19,22)
: 输出应该是什么?
: 谢谢

p*****2
发帖数: 21240
40

你这么一说我code里还有bug

【在 S**N 的大作中提到】
: 那如果是 {(3,5),(7,16), (23,78)}
: (19,22)
: 输出应该是什么?
: 谢谢

相关主题
树 inorder下个节点最好办法是啥哪个高手能指出我程序的问题 (20几行的代码)
这种解法对吗?merge two BSTGoogle电面
interval tree vs. merge intervals请问怎样写没有parent pointer的BST iterator?
进入JobHunting版参与讨论
b*****c
发帖数: 1103
41
输出
(3,5),(7,16), (19,78)
b*****c
发帖数: 1103
42
22,23是连续的咯,合并咯
p*****2
发帖数: 21240
43

靠。这题我问题太多了。

【在 b*****c 的大作中提到】
: 22,23是连续的咯,合并咯
p*****2
发帖数: 21240
44

你不说我一直没注意这点。

【在 b*****c 的大作中提到】
: 22,23是连续的咯,合并咯
w****x
发帖数: 2483
45
先对起点排序,排好了用下面的函数
void PrintMerge2(int a[], int n)
{
assert(a && n > 0 && n%2 == 0);
int nBeg = a[0];
int nEnd = a[1];
for (int i = 2; i < n; i += 2)
{
if (a[i] > nEnd)
{
cout< nBeg = a[i];
nEnd = a[i+1];
}
else
{
if (a[i+1] > nEnd)
nEnd = a[i+1];
}
}
cout< }
p*****2
发帖数: 21240
46
这个interviewer在我写code的时候一直低头在laptop上貌似工作。我写一段想给他解
释一下,不见他抬头。最后只能一气写完,他抓了个bug就结束面试了。刚开始以为很
简单的题,后来越写code越乱。尤其是不得不转用C#写。
b*****c
发帖数: 1103
47
也没啥的,事后再重新写一下,很多interviewer都会抄下你的代码供committee看
p*****2
发帖数: 21240
48

你觉得这题用C好搞吗?最怕面C碰到Java程序员。上次面A也碰到这么一个。

【在 b*****c 的大作中提到】
: 也没啥的,事后再重新写一下,很多interviewer都会抄下你的代码供committee看
b*****c
发帖数: 1103
49
list (list span_lis, Node & span)
{
if (span_lis==NULL) return NULL;
list::iterator iter=span_lis.begin();
while (iter!=span_lis.end())
{
if ((*iter).second>=span.first-1)
{
(*iter).first=min((*iter).first,span.first);
(*iter).second=max((*iter).second,span.second);
while (++iter !=span_lis.end())
{
if ((*iter).first>*boost::prior(iter).second+1)
{
break;
}
else
if ((*iter).second>*boost::prior(iter).second)
{
*boost::prior(iter).second=(*iter).second;
span_lis.erase(iter--);
break;
}
else
{
span_lis.erase(iter--);
}
}
return span_lis;

}
iter++;
}
span_lis.push_back(span);
return span_lis;
}
s******n
发帖数: 3946
50
不一定吧, 看成浮点就不用合并22,23

【在 p*****2 的大作中提到】
:
: 你觉得这题用C好搞吗?最怕面C碰到Java程序员。上次面A也碰到这么一个。

相关主题
Google Front-end Software Engineer Phone InterviewLowest common ancestor of two nodes of Binary Tree
bloomberg onsite题在版上看到的G题
How to find the kth biggest number in a BSTBST 找重复节点数
进入JobHunting版参与讨论
q****x
发帖数: 7404
51
algorithm: interval tree
coding: sort, binary search, sequential search.

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

p*****2
发帖数: 21240
52

删除右儿子用C操作起来还是有点麻烦。不过也还过得去。一会儿练练。这么看来这道
题出的也不算过分。用C的时候最后把后边的span往前移一下就可以了。

【在 z****u 的大作中提到】
: 这个应该就是一个 BST 的变种吧
: 按照 span 的 begin 值建立 BST
: 每次插入一个新的 span 的时候,如果这个span的 begin 值在某个 node 的范围之内
: ,合并,否则就是按照 BST 的规则进行插入
: 值得注意的是,合并的时候,需要判断合并后的 span 跟它的右儿子有没有相交,有的
: 话,继续合并,然后删除右儿子

p*****2
发帖数: 21240
53
再问个问题
recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
后再improve。这算不是误导呀?
A**u
发帖数: 2458
54
没有误导你啊
这题目写起来也麻烦呢

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

n*******w
发帖数: 687
55
这个是正确的方向。一时找不出最优解,先brute force都行。你多点时间考虑或者实
现过程中能找到思路。
这个题应该不是语言的问题。用c或java基本也没差太多。
但是感觉你有些不清晰的地方。list用array还是linkedlist;合并的时候只要比较end
就行了,(start是先排好序的)这个逻辑要清晰。
interval的问题算是面试中比较繁琐的问题。

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

A**u
发帖数: 2458
56
你这也太夸张了
bst都用上了
得自己写一个bst?
面试来说,是不是太麻烦了

【在 z****u 的大作中提到】
: 这个应该就是一个 BST 的变种吧
: 按照 span 的 begin 值建立 BST
: 每次插入一个新的 span 的时候,如果这个span的 begin 值在某个 node 的范围之内
: ,合并,否则就是按照 BST 的规则进行插入
: 值得注意的是,合并的时候,需要判断合并后的 span 跟它的右儿子有没有相交,有的
: 话,继续合并,然后删除右儿子

n*******w
发帖数: 687
57
不麻烦的。用bst存interval,写递归。
跟树的遍历很类似。比预想简单的多。
只是直接用数组已经足够了。按start sort。

【在 A**u 的大作中提到】
: 你这也太夸张了
: bst都用上了
: 得自己写一个bst?
: 面试来说,是不是太麻烦了

s******n
发帖数: 3946
58
数组需要sort吗?题目里好像已经排序好了。
s******n
发帖数: 3946
59
数组需要sort吗?题目里好像已经排序好了。
y***d
发帖数: 2330
60
用 c 也不烦,想得太复杂了
newSpan=(10,19)
for each span in list
if overlap with newSpan
merge into newSpan
else
print span
print newSpan
这是没有 sort 的情况。

【在 p*****2 的大作中提到】
: 我面试都用C,有些题觉得用C做比较麻烦。这就是一道。大家给评评。我现在也没有很
: 简洁的算法。
: 一个span array, 比如{(3,5),(7,16), (23,78)...}
: 然后给定一个span, 比如 (10,19), 把这个span 跟 这个array merge.
: 当时没听明白,以为是两个array, 做到一半的时候才搞明白。
: 这题我上来就觉得C比较麻烦,所以我就说用C#吧,我想用List. 定义Node as
: struct Node
: {
: int start;
: int end;

相关主题
recovery BST 不考虑相同值的情况么?Uber 面经
一道C面试题最近没有什么新题
贡献G电 估计挂了谁有较好的iterative后序遍历binary tree的代码?
进入JobHunting版参与讨论
q****x
发帖数: 7404
61
如果不用区间树,那排序数组更简单。

【在 n*******w 的大作中提到】
: 不麻烦的。用bst存interval,写递归。
: 跟树的遍历很类似。比预想简单的多。
: 只是直接用数组已经足够了。按start sort。

a********m
发帖数: 15480
62
不算。过程比结果更重要。

【在 p*****2 的大作中提到】
: 再问个问题
: recruiter跟我强调了多次,不要着急找出最优解,先找个solution work,写完代码然
: 后再improve。这算不是误导呀?

p*****2
发帖数: 21240
63

可是他一直在搞电脑都不抬头看我呀。所以没啥过程了。

【在 a********m 的大作中提到】
: 不算。过程比结果更重要。
a********m
发帖数: 15480
64
"think loudly". 边写边说很重要。你写白伴的时候他们需要记录所有的代码,跟上你
的思路,也很忙的。

【在 p*****2 的大作中提到】
:
: 可是他一直在搞电脑都不抬头看我呀。所以没啥过程了。

g***x
发帖数: 494
65
这个好,但好像还少了点,merge 了 newspan之后,span i的end可能变化和i+1有重叠
,又要merge

【在 y***d 的大作中提到】
: 用 c 也不烦,想得太复杂了
: newSpan=(10,19)
: for each span in list
: if overlap with newSpan
: merge into newSpan
: else
: print span
: print newSpan
: 这是没有 sort 的情况。

p*****2
发帖数: 21240
66
今天用C#写了一遍,还是挺麻烦的。
f*******t
发帖数: 7549
67
我以前写过一个程序,用linked list存interval,按起始位置排序,各线段不重叠。
要往里插入新的节点相当不好写对,有多种情况和边界条件。
interval tree概念是不复杂,面试中基本没可能写出来。
w***y
发帖数: 6251
68
这题看起来简单, 做起来发现自己出很多错啊 555555
目前我比较了自己的答案和大家的讨论, 采用了这个方法. 本来我还用了一个新的list
记录, 还要看原list哪些被merge之后会引起后面的继续被merge//囧

【在 w****x 的大作中提到】
: 先对起点排序,排好了用下面的函数
: void PrintMerge2(int a[], int n)
: {
: assert(a && n > 0 && n%2 == 0);
: int nBeg = a[0];
: int nEnd = a[1];
: for (int i = 2; i < n; i += 2)
: {
: if (a[i] > nEnd)
: {

l*********y
发帖数: 142
69
#include
#include
#include
using namespace std;
struct Segment {
Segment(int l, int r) : left(l), right(r) {};
int left;
int right;
};
vector input;
vector output;
void MergeInput(vector& input, Segment& cand)
{
int left = cand.left;
int right = cand.right;
// 处理边界情况
if (input.size() == 0 || cand.right < input.front().left || cand.left >
input.back().right) {
output.push_back(Segment(cand.left, cand.right));
return;
}
bool insert = false;
for (int i = 0; i < input.size(); i++) {
Segment cur = input[i];
if (cand.right >= cur.left) {
if (cur.right >= cand.left) {
left = min(cur.left, left);
right = max(cur.right, right);
} else {
output.push_back(cur);
}
} else {
insert = true;
output.push_back(Segment(left, right));
output.push_back(cur);
}
}
// 注意结尾的处理
if (! insert) {
output.push_back(Segment(left, right));
}
}
int main() {
int left, right;
cin >> left >> right;
Segment cand(left, right);
while (cin >> left >> right) {
Segment cur(left, right);
input.push_back(cur);
}
MergeInput(input, cand);
for (int i = 0; i < output.size(); i++) {
cout << output[i].left << " " << output[i].right << endl;
}
return 0;
}
input:
10 19
3 5
7 10
19 21
23 78
output:
3 5
7 21
23 78
请大家看看。
g**********y
发帖数: 14569
70
我觉得这个差不多就是G expect to see的答案,left/right没必要,直接改cand就可以。

【在 l*********y 的大作中提到】
: #include
: #include
: #include
: using namespace std;
: struct Segment {
: Segment(int l, int r) : left(l), right(r) {};
: int left;
: int right;
: };
: vector input;

相关主题
谁有较好的iterative后序遍历binary tree的代码?这种解法对吗?merge two BST
转一些我blog上一些常见的二叉树面试问题和总结interval tree vs. merge intervals
树 inorder下个节点最好办法是啥哪个高手能指出我程序的问题 (20几行的代码)
进入JobHunting版参与讨论
g**********y
发帖数: 14569
71
写了个Java版的。这个题在interview时很不好写,尽是细节,到处都可以犯错误。容
易误入歧途的,是试图在输入list上直接改,那个写起来,就不是interview时间可以
写清楚的了。除非你是大牛,思路极其清楚。我是一定写一堆bug出来。
这里只是打印出来,生成新List是一样的。
private void merge(List list, Node newNode) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Node node = iterator.next();

if (newNode.end < node.start) {
newNode.print();
node.print();
while (iterator.hasNext()) iterator.next().print();
return;
}

if (newNode.start > node.end) {
node.print();
}
else {
newNode.start = Math.min(newNode.start, node.start);
newNode.end = Math.max(newNode.end, node.end);
}
}
newNode.print();
}

private class Node {
int start;
int end;
public Node(int start, int end) {
this.start = start;
this.end = end;
}

public void print() {
System.out.println(this.start + ", " + this.end);
}
}
d******u
发帖数: 397
72

z****h
发帖数: 164
73
好像还是没处理相邻intervel的合并。比如:(17,22),(23, 7
8)应该变成(17,78)

【在 g**********y 的大作中提到】
: 写了个Java版的。这个题在interview时很不好写,尽是细节,到处都可以犯错误。容
: 易误入歧途的,是试图在输入list上直接改,那个写起来,就不是interview时间可以
: 写清楚的了。除非你是大牛,思路极其清楚。我是一定写一堆bug出来。
: 这里只是打印出来,生成新List是一样的。
: private void merge(List list, Node newNode) {
: Iterator iterator = list.iterator();
: while (iterator.hasNext()) {
: Node node = iterator.next();
:
: if (newNode.end < node.start) {

z****h
发帖数: 164
74
public class Pair{
int left;
int right;
Pair next;
public Pair(int left, int right)
{
this.left = left;
this.right = right;
this.next = null;
}
}

private Pair getPurgedPairs(Pair head)
{
if(head == null || head.next == null) return head;
Pair curr = head;
while(curr != null)
{
Pair next = curr.next;
while(next != null && next.left <= curr.right +1){
if(next.right > curr.right){
curr.right = next.right;
curr.next = next.next;
}else
{
curr.next = next.next;
}
next = curr.next;
}
if(next == null) break;
curr = next;
}
return head;
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
recovery BST 不考虑相同值的情况么?这种解法对吗?merge two BST
一道C面试题interval tree vs. merge intervals
贡献G电 估计挂了哪个高手能指出我程序的问题 (20几行的代码)
Uber 面经Google电面
最近没有什么新题请问怎样写没有parent pointer的BST iterator?
谁有较好的iterative后序遍历binary tree的代码?Google Front-end Software Engineer Phone Interview
转一些我blog上一些常见的二叉树面试问题和总结bloomberg onsite题
树 inorder下个节点最好办法是啥How to find the kth biggest number in a BST
相关话题的讨论汇总
话题: node话题: int话题: list话题: span话题: end