面试题集(持续更新)
1一个概率题:54张扑克牌,除去两张大小王剩下52张扑克牌。问红桃A和黑桃A同时被一个人拿到的概率是多少?
>>>4/17 = C(4,1)*C(50,11)/C(52,13)
2、给你n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。
>>>利用异或运算的一个神奇性质,“数A两次异或同一个数B,结果还是数A,这两次异或运算不一定要是连续的”,从头到尾进行
一次异或,最终的结果就是那个出现了奇数次的数。
3,上千万条记录,统计出重复记录最多的前N条。
>>> 先散列,统计出每条记录的重复数目,O(n), 然后求前N最大值,O(n)。
4、一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum
>>>Hash表,将N个整数散列到Hash表上,O(n),然后依次遍历去查找(sum-当前整数),看能否找
的到,总体O(n)。
5, 给你n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。
>>>首先应用4给出的方法,得到那两个奇数异或后的结果,这个结果肯定是不为0的。然后根据这个结果,比如为011001,利用最后
一个1将这n个数字划分为两组,然后针对这两组分别再应用4中给出的方法。
6、有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒。
用二进制算法。
把1000瓶水编号,每个编号写成二进制的形式,pow(2,10) = 1024 > 1000,这样每个编号就有10位。
把10只小白鼠编号,从1到10,让第N号小白鼠去喝瓶子编号第N为为1的水,
新定义一个十位二进制数,最终死掉的小白鼠的编号的位全部为1.
比如 1,3,5,7,8号小白鼠死掉了,那有毒的瓶子的二进制编号就是 101010110