总结几道经典面试笔试题

来源:互联网 发布:天津大学网络教育仙游 编辑:程序博客网 时间:2024/05/01 21:08

1)各大网络公司都喜欢问,比如说给你两个存放有10G个名字的文件,每个名字需要64个字节,你的电脑只有4G内存,问怎样找到两个文件中相同的名字(假设单个文件中没有重复)。

    这个问题其实代表了很常见的一类问题,即大数据的处理问题,这类问题通常的做法是使用hash函数将大文件中的数据放到内存可以放下的小文件中,然后调用普通方法(如内存中的统计,排序)进行处理。上面的问题每个文件有640G的大小,按照内存4G处理,可以把两个文件分成320个小文件,然后对每个名字进行hash处理,分到320小文件中,然后将小文件读到内存中进行名字统计,如果摸个名字出现了两次则是两个文件中重复的。

(2)给你10个盛放药品的瓶子,其中9个是放的是A,另一个放的B,A和B放到一起会在60分钟后变色,问给你70分钟,问至少需要几只试管可以测出那只瓶子中存放的是B。

    问题很高级,解法很巧妙,首先将十只瓶子进行编号(0000,0001,0010,0011,0100,0101,0110,0111,1000,1001),然后取四只试管,分别代表四位,将相应位为1的药瓶中的药品取少量放入试管中,等待60分钟后,变色的位代表1,不变色的代表0,这样就找到盛有B药品的药瓶编号,所以四个试管就可以找出盛有B药品的药瓶。

(3)有1000盏等,编号从1到1000,有1000个人,编号从1到1000,所有的灯开始都是灭的,每个人必须对是他自身编号倍数(如3可以对3,6,9...号灯进行操作)的灯进行一次操作,如果灯是亮的就按灭他,否则按亮他。问所有的人都操作成后,所有的灯是什么状态。

    可以通过特例来进行分析,如16和20,9可以被1,16,2,8,4操作,然后他是亮的,20可以被1,20,2,10,4,5操作,最后他是灭的,所以对于一个数N,只要有一个数x可以整除他,那必定有一个y存在,y=N/x,所以他们这样的数对N的操作可以抵消,只有当x=y时不能被抵消,即N开方是整数时,不可以被抵消,这样的灯是亮的,其余的灯是灭的。

(4)给你一个函数f(),他以概率p产生0,以概率1-p产生1,问如何生成一个函数g(),以相同的概率产生0和1。

    问题很巧妙,要求你用f()生成两种概率相等的状态就行,其他变种也都差不多,也是找到n中概率相等的状态就可以了。如使用f()两次,可以产生(0,0),(0,1),(1,0),(1,1),显然产生(0,1),(1,0)状态就是相等的,产生其他状态是可以在重复调用两次f()直到产生需要的两种状态位置,这样就构造除了g()函数。

(5)给你一个大小为N的数组int[] A,求取N个乘积,第i个乘积为除去A[i]的数组中所有数的乘积,不能用除法,问如何在O(n)的时间复杂度内,求的所有的N个乘积。

    这个问题是明显的空间换时间的问题,可以对数组遍历两遍求取所有数组的从前到后,从后到前的部分积,如现在要求第i个乘积,只需取出从1到i-1的部分积和从N到i+1的部分积相乘就可以了,总共进行了3N次操作,时间复杂度为O(N)。

(6)给你一个天平,称三次,问最多可以从多少个小球中找到质量较轻的一个。

    答案是27个,因为天平每次可以将小球分成三组,并可以判断质量较轻的那个小球在那一组中,三次就可以找出较轻的那个。

原创粉丝点击