面试题:搜索大于n/3个数的变量

感谢陈立人http://weibo.com/lirenchen?topnav=1&wvr=5&topsug=1的每天一道面试题的资料整理。关注“待字闺中”的微信,里面有题目的分析。我会post他整理的题目,供大家一起学习。

原题

给定一批查询日志,数量为n。其中,有的查询出现多于n/3次,请在线性时间内,找到所有满足条件的查询。

分析

我个人第一反应就是对其排序,或者map函数进行计数。效率一般。

以前的面试题,有一道是说查找多于出现一半的查询,简单的方法就是碰见到两个,如果两个不同,就同时删掉这两个。一直删掉最后,剩下的就是满足条件的。

其可以继续扩展,有的查询出现多于n/m次,找到满足条件的查询。

有一种很巧妙的方法,其想法的实现就是俄罗斯方块。

大体思路:

用一个map函数将查询对应到一个值。

  • 查询不在map函数里面,添加新的map值,将其值设为1。
  • 查询在map函数里面,追加其map后的值,将其值加1。
当map函数里面映射的个数等于m时,就消除一行。

例如:遇到以下查询序列:
4,4,2,3,1,3,2,3,5,4 
m=5,就是说那个map映射的个数等于5,填满了一行,就消掉一行。

先来了4,4,2,3这批查询,分别填入map里面。






4



4 2 3

然后来了新一批查询:1,3,2,3,5。

此时,来了5,map的映射个数已满(为5),所以可以消掉一行。



3

4 2 3

4 2 3 1 5

这时就像俄罗斯方块一样,一行满了,消失掉。此时map的映射就会变成这样(减1),








3

4 2 3


最后,当删除剩下的,就是满足条件的查询。

这种方法十分高效,线性时间就可以满足了。

你可能感兴趣的:(面试题:搜索大于n/3个数的变量)