程序员面试题精选--从文件中随机提取一个字符串

来源:互联网 发布:男生自慰肛门知乎 编辑:程序博客网 时间:2024/05/29 15:12

这是前几天去新浪微博面试被问到的问题!

题目是这样的:

一个文件中按行存放若干字符串,要求只能按顺序遍历文件一次,不能用表格存储字符串偏移,随机返回一个字符串。

本人愚笨,在那挣扎了半天没有结果,悻悻而归。

今天在看《C专家编程》,猛然发现,附录A.6就是原题!真是悔恨啊,读书太少啊,苍天大地啊~~

它是这样解的:

基本的技巧是在幸存的字符串中挑选,并在过程中不断更新。

打开文件并保存第一个字符串,些时就有了一个备选字符串,并有100%的可能性选中它。保存这个字符串,继续读入下一个字符串,这样就有了两个字符串,选中每个的可能性都是50%。选中其一并保存,然后丢弃另一个。再读入下一个字符串,按照新字符串33%原先幸存的字符串67%的概率(它代表前两个字符串的幸存者),在两者之间选择一个,然后保存新选中的字符串。

根据这个方法,依次对整个文件进行处理。在其中每一步,读入字符串N,在它(按照1/N的概率)和前一个幸存的字符串(按照N-1/N的概率)之间进行选择。当达到文件末尾的时候,最后一个幸存的字符串就是从整个文件中随机提取的那个字符串!

请参阅《C专家编程》281页 附录A.6。

此方法效率较低,哪位有更高效的方法,欢迎留言讨论!