人搜笔试题目

1. 快排每次以第一个作为主元,问时间复杂度是多少?(O(N*logN))

2. T(N) = N + T(N/2)+T(2N), 问T(N)的时间复杂度是多少?(O(N))

3. 从(0,1)中平均随机出几次才能使得和超过1?(e)

4.编程题:

 一棵树的节点定义格式如下:

 struct Node{

Node* parent;

Node* firstChild; // 孩子节点

Node* sibling; // 兄弟节点 

}

要求非递归遍历该树。

思路:采用队列存储,来遍历节点。

5. 算法题:

有N个节点,每两个节点相邻,每个节点只与2个节点相邻,因此,N个顶点有N-1条边。每一条边上都有权值wi,定义节点i到节点i+1的边为wi。

求:不相邻的权值和最大的边的集合。

思路:


上图形象的表示了题目中的点与线的关系。

看到题目,初步猜到可以用到线性规划的思想。

定义f(k)为:前k条边中的最大的权值和。

则,f(k) = max{f(k-1),  f(k-2) + wk}

根据该就可以在O(N)下求得最大权值和。

为了保存最大权值和对应的边集合,我们对每一个k,保存一个集合来保存对应的边集合。

因此,有:

f(0) = w0;

f(1) = w1;

for (i = 2: N-2)

if  f(i-1)  > f(i-2)+wi

Set(i) = Set(i-1);

f(i) = f(i-1);

else

Set(i) = Set(i-2) <= i;   // 将i加入集合

f(i) = f(i-2)+wi;

end;

end;

以上就是本人能想到的解法,如果有更好的解法,欢迎不吝赐教。


你可能感兴趣的:(编程,算法,struct,存储,图形)