总结几道经典面试笔试题

来源:互联网 发布:问卷星软件下载 编辑:程序博客网 时间:2024/05/02 00:59

1,一个5升的容器,一个3升的容器,都是不规则的,如何得到4升的水
答(1) 将5升的容器装满,然后倒到3升的容器,这样5升的容器还有2升的水
(2) 在装满3升的容器里,将水倒掉,然后把5升容器中的2升水倒到3升的容器中。
(3) 将5升的容器重新装满水,把水倒到已经装好2升的3升容器中,直至3升的容器已经满。
(4) 这样5升容器中实质倒1升到3升的容器中,就剩下 4 升水。
有一个逻辑题目,说有10箱苹果,每箱苹果有10个苹果,其中有9箱每箱每个苹果的重量是一斤,还有1箱里面所有的苹果重量都是9两,现在有一个称,只能称一次,怎么找出苹果都是9两的那一箱?
0) 一根不均匀的绳子, 从头到尾烧需要整整一个小时烧完,有很多条同样的绳子,请问我该怎么做才能得到1小时15分钟呢?

答案:准备3条绳子,第一条两头点燃,第二条一头点燃,第三条暂时不点燃;第一条烧尽时,过了半个小时,与此同时,第二条还剩一半,第三条完整;第二条另一端点燃,第三条不动;第二条烧尽时,又过了15分钟;第三条两头点燃,烧尽时要30分钟,共1小时15分中;

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个,因为天平每次可以将小球分成三组,并可以判断质量较轻的那个小球在那一组中,三次就可以找出较轻的那个。
7.平衡点问题
平衡点:比如int[] numbers = {1,3,5,7,8,25,4,20}; 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点
要求:返回任何一个平衡点

8.支配点问题:
支配数:数组中某个元素出现的次数大于数组总数的一半时就成为支配数,其所在位序成为支配点;比如int[] a = {3,3,1,2,3};3为支配数,0,1,4分别为支配点;
要求:返回任何一个支配点

原创粉丝点击