面试题1 落单的数
题目描述:
有2n+1个数,其中2n个数两两成对,1个数落单,找出这个数。要求O(n)的时间复杂度,O(1)的空间复杂度。进阶问题:如果有2n+2个数,其中有2个数落单,该怎么办?
答:
初阶:将2n+1个数异或起来,相同的数会抵消,异或的答案就是要找的数。
进阶:假设两个不同的数是a和b,并且a!=b,将2n+2个数异或起来就会得到c=a xor b,并且c不等于0。因此在c的二进制位中找到一个为1的位,可推断在这位上a和b分别为0和1,因此将2n+2个数分为该位位0的组和该位为1的组,两组中各自会包含2n’+1个数和2n’’+1个数,用初阶的算法即可解决。
面试官说:
该问题的考点,在于异或符号的运用。异或运算是计算机系的基础知识。上过课的同学一般来会答得上第一问。第二问会不会被问到看面试官心情。一般来说,对于一个问题的扩展问题,解题的思路是如何将它通过一定的变换转换为初级问题。因此就要去想怎么分为两组,两组各包含2x+1个数就问题得解。会初阶问题以后,基本上会想到把所有数异或起来,得到a xor b。再根据题目中的题目a与b不同,意味着该值不为0,从而想到根据该值的二进制位为1的位来将2n+2个数分为两组。
面试题2 抄书问题
有n本书和k个抄写员。要求n本书必须连续的分配给这k个抄写员抄写。也就是说前a1本书分给第一个抄写员,接下来a2本书分给第二个抄写员,如此类推(a1,a2需要你的算法来决定)。给定n,k和每本书的页数p1,p2..pn,假定每个抄写员速度一样(每分钟1页),k个抄写员同时开始抄写,问最少需要多少时间能够将所有书全部抄写完工?(提示:本题有很多种算法可以在不同的时间复杂度下解决,需要尽可能的想到所有的方法)
答:
解法1:动态规划 设f[i][j]代表前i本书分给j个抄写员抄完的最少耗时。答案就是f[n][k]。状态转移方程f[i][j] = min{max(f[x][j-1], sum(x+1, i)), j<x<i}。其中x是在枚举第j个抄写员是从哪本书开始抄写。 时间复杂度O(n^2*k)
解法2:动态规划+决策单调。 同上一解法,但在x的枚举上进行优化,设s[i][j]为使得f[i][j]获得最优值的x是多少。根据四边形不等式原理,有s[i][j-1]>=s[i][j]>=s[i-1][j]。因此x这一层的枚举不再是每次都是n而是总共加起来n。 时间复杂度O(n*k)
解法3:二分答案。二分最慢的时间,然后尝试一本本的加进来,加满了就给一个抄写员。看最后需要的抄写员数目是多余k个还是少于k个,然后来决定是将答案往上调整还是往下调整。 时间复杂度O( n log SUM(pi) )
面试官说:
该问题的考点在于对算法能力进行评级。需要一定的算法知识积累,如对动态规划和二分法需要有一定了解。面试官不一定会需要你答出所有的解法,但一般来讲至少需要答出O(n^2*k)的动态规划的解法。
面试题3 找坏球
有12个球,1个没有砝码的天秤。其中有11个球的重量是一样的,另外1个是坏球,和其他球的重量不一样,但无法确定是轻了还是重了。请问如何用天秤称3次,就找到坏球并确定是轻了还是重了。(没有砝码的天秤只能比较出两边谁重谁轻或是重量相等,无法求得具体的重量差)
答:
将球进行编号: 1 2 3 4 5 6 7 8 9 10 11 12,分为三组:(1,2,3,4) (5,6,7,8) (9,10,11,12)
第一称:称前两组。
相等:可以知道8个球都是好的。
第二次:称(1,2,3)和(9,10,11)。
相等:12是坏球,用1和12称第三次就知道是重还是轻。
不等:9,10,11 有坏球,并且已经知道是轻还是重。第三次称9和10就可以得到结果。
不等:假设(1,2,3,4) < (5,6,7,8) (反过来的情况同理),并且知道了9,10,11,12是好球。
第二次:称(1,2,5)和(3,4,6)。
相等:7和8有一个重,称第三次即可。
不等:假设(1,2,5)<(3,4,6)(反过来类似)。说明1,2轻了,或者6重了,第三次称1,2即可。
面试官说:
一般问这个问题的公司就是想找平时喜欢研究智力题的人,或者他们公司的招聘名额很少。这是一个十分经典的智力问题。一般来说很难要求面试者在几分钟之内考虑周全。所以碰到这样的问题,知道就是知道,不知道就是不知道。不过即便不知道,比较聪明的面试者还是能够大致说出一些思路。比如一开始分成3堆,这个思路答上就会加分。如果分成2堆6个和6个,你会发现基本是解不出来的。所以这个题目纯粹是考验你是否是一个聪明的面试者或者你是不是准备面试题的时候做过了(那也说明你态度很端正)。
面试题4 索引比例
估算Baidu和Google的网页索引数量之比。
答:
我们可以假设能够通过搜索引擎做到如下的两件事:
1. 随机取到一个网页
2. 判断某个网页(url)是否被索引
因此,在Baidu上多次随机关键词进行搜索,获取到每个关键词对应结果的若干网页信息(url),将这些url在Google上查找是否被索引到。从而得到Baidu网页中Google索引的的比例为1/B。
对Google做同样的事情,得到Google网页中被Baidu索引的比例1/G。由此可知Baidu和Google的索引比例为B:G