首页 > 代码库 > 2016百度实习一面

2016百度实习一面

总共有四道题,其他三道感觉比较简单,第一题记录单词个数,但是单词数量比较多,所以用map搞。第二题遍历树,得出树中每个节点的深度。第三题求单个lca。

最难的一题是一道思维题,给出n个数(n<=10^6),如果有两个数a,b,满足2*a<=b,则可以把数a装入数b中,每个数最多只能装一个数,问最多有多少个数可以被装?

举个荔枝:

假设现在n=5

这5个数为:4 1 2 8 9

我们先排个序得1 2 4 8 9

然后1->2,4->8则最多有两个数被装人。

这时很容易想到几种贪心策略,比如排序后,从最小的开始贪心,或从最大的开始贪心。

这里给出一组数据说明这种贪心是错误的。

n=4

1 2 4 7

n=4

3 5 10 20

然后来看下这个问题到底应该怎么去想。

首先,要找到一个关键性质,在排序之后,一定存在某个数x,使得最优解中被装入数在x的左边,装入数在x的右边。

接下来看图。

技术分享

 

2016百度实习一面