1给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。、
2给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 (这道题面试官说有O(1) 的解法,。。。。。)
3五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。
stephenxu111 :
引用
1 这个我觉得最好要参考数据库索引的类似算法,比如B树(其实我们可以想象一下,各大数据库厂商早就为我们解决这个问题了,那些大型数据表索引是怎么工作的?一样的有大文件,一样的有限内存!)。
2 只要定义一个合适的特征码,然后用hash结构保存,就可以达到O(1)的解法。
比如:对单词aadb 定义特征码如下a2b1d1, dddabc的特征码是a1b1c1d3,以此类推(各位大侠可以设计更好的特征码)。
数据结构定义如:hash_map >,其中hash_map的key是特征码,value是兄弟单词集。首先扫描字典,将所有单词的特征码和相应单词集装入这个数据结构。
查找时,先计算出待查单词的特征码,然后搜索一下hash_map里相应set的大小,就知道有多少个兄弟单词了。
3 这个问题的解法如下(首先假定只要不把球从天平拿下来就还算一次,另外每个桶内的球是一样的):
1)从1号和2号桶各拿一个,放上天平(1号左,2号右),如果平衡,说明这两桶球都是正常的,可以做为砝码。如果不平衡,那么1号和2号桶必有一个不正常,而其他3,4,5桶是正常的,可以作为砝码。
2)首先考虑1号2号桶不平衡的情况,这时从1号和3号桶再各拿一个球,放上天平(1号右,3号左),如果这时平衡了,说明1号桶是不正常的,如果还是不平衡,那么2号桶是不正常的。
3)如果第一步1号2号桶是平衡的,那么也好办,把3,4号桶各拿一个放上天平(3号左,4号右),这时如果还是平衡的,那么5号桶必然是不正常的。如果不平衡,说明不正常的就在3,4号桶之中。我们再用2)的方法找出来即可。
related articles: http://blog.csdn.net/stephenxu111/archive/2008/05/05/2394987.aspx#802680