Mengdong的技术博客

学习,记录,分享

导航

百度实习电面(二)

先是问论文/研究,轻松搞定。

1. 输出1234567*(2^987654321)的后10位数

答案是(1234567*(2^987654321))%(10^10).关键是怎么算出这个数
利用取模操作。取模满足分配率:(a*b)%c=((a%c)*(b%c))%c
可将2^987654321分为2^m*2^m*...*2^n(m>=n).

2. Java中ArrayList中插入一个元素的平均复杂度是多少?

O(1). 回答得不好。可见数据结构:线性表/数组那一节。

面完马上又打进来一个,还是那边的人,不过是另一个。
可能是协调的问题,两个人同时对我进行二面。

第二个人也是先问科研,很快结束。

1. 两个集合,怎么求交集?

类似DB里面的Join操作,说了两种:归并/Hash
归并:将两个集合排好序,然后用类似归并排序的方式取交集。
Hash:用比较小的集合建一个Hash表,然后大集合的每个元素到Hash表里查找,能找到的都属于交集。
然后问为什么用比较小的建Hash表,为什么不用比较大的?
因为小的建出来的Hash表占空间小,查找也快。
对面马上举反例:如果一个尺寸为1,另一个为100,那么用100的建Hash表,只要查找一次就取完交集了。
差点掉到陷阱里。不过马上反应过来反驳:建哈希表也是有开销的。

2. 快排的思想?

递归划分,不停地将比中间数小的划分到一边,大的另一边。划分到列表长度剩1的时候就搞定了。

3. 快排的平均复杂度?最大复杂度?

平均O(n*logn),最大O(n^2).

4. 为什么快排的平均复杂度是O(n*logn)?

回答得不好。

5. 现在有一个单片机,只提供单字节(char)的读/写函数,如何支持float的读/写?

转化为多次char型的操作。

6. 现在有一个广告投放系统,如何保证rank公平?

开放性问题。比如现在有2个广告,广告1的点击/展现是10/10000,广告2是1/10,广告3是0/5,如何公平展现?
言下之意:广告1的点击率为1/1000,这是一个比较稳定的点击率(因为展现次数已经很多了);而广告2虽然点击率比较高,但因为展现很少,还无法确定它真正的受欢迎程度(这已有的1次点击可能纯属偶然,也许接下来几万次展现都不会被点击);广告3虽然最低,但可能只是暂时没人点。所以单纯地按照点击率rank是不够公平的。

问题的核心是:

1) 如何让新广告有机会(例如广告3那种);
2) 同时让那些难以命中的广告能快速沉下去(例如,广告2从此以后一直没有人点击,如何让它快速沉下去。只通过点击率等它跌到1/1000以下是很慢的)。

我提出的思路:

1) 给每个新加入的广告一个较高的起始值i
2) 加入不点击衰减因子c,不命中的时候加速下沉

比如当前rank=点击/展现=h/s. 下一次展现,并点击,则rank变为(h+1)/(s+1)(这个暂时不改)
但当展现但未点击时,rank不再简单变为h/(s+1),而是加一个衰减因子更新为h/(s+1+c), 其中c>0.
然后对方顺着问,如何确定i和c合理的值?
我回答用历史数据模拟,假设有t1时间点n个广告(a1,a2,...,an)的rank值集合R1.
现在将时间回退至t0(初始状态),然后考虑不同的i,c值,模拟(t0->t1)时间段的广告投放、展现、访问过程,得到考虑i,c下t1时n个广告(a1,a2,...,an)的rank值集合R1'.
比较R1和R1',是否R1'较R1有更好的区分度(即R1中相对较低的在R1'中是否更低,R1中相对较高的在R1'中是否更高)
经过若干次迭代尝试,算出最优的i,c值。讨论到此完毕。

自我感觉应该能拿到Offer.

教训:算法分析能力太差,关于复杂度的问题一问一个砸。

更新:拿到Offer.

posted on 2011-05-06 15:59  mdyang  阅读(701)  评论(0编辑  收藏  举报