从游击队到正规军

专注嵌入式系统内核开发

九月腾讯,创新工场,淘宝等公司最新面试十三题
  1. 五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;......其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?(朋友说,这是小学奥数题)。
  2. 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
  3. 给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。
  4. 要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。
  5. 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。
  6. 淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。
  7. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。(此题请参考本博客内其它文章)。
  8. 某服务器流量统计器,每天有1000亿的访问记录数据,包括时间、url、ip。设计系统实现记录数据的

    保存、管理、查询。要求能实现一下功能:
    (1)计算在某一时间段(精确到分)时间内的,某url的所有访问量。
    (2)计算在某一时间段(精确到分)时间内的,某ip的所有访问量。

  9.  假设某个网站每天有超过10亿次的页面访问量,出于安全考虑,网站会记录访问客户端访问的ip地址和对应的时间,如果现在已经记录了1000亿条数据,想统计一个指定时间段内的区域ip地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满足上面的统计需求呢,
    设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?

  10.  腾讯1.服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
    腾讯2.如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。

  11.  如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串。

  12.  创新工场面试题:abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。问他们一共打了多少条鱼,写程序和算法实现。提示:共打了多少条鱼的结果有很多。但求最少打的鱼的结果是3121条鱼(应该找这5个人问问,用什么工具打了这么多条鱼)。

  13. 淘宝2012笔试(研发类):http://topic.csdn.net/u/20110922/10/e4f3641a-1f31-4d35-80da-7268605d2d51.html

 1.猴子分桃问题的答案是:3121 

#include <stdio.h>

//返回值>0,成功
int divide(int InputNumber)
{
	int i;
	int MidNumber;

	for (i=0; i<5; i++)  //5个猴子分别对桃子操作一遍
	{
		if (InputNumber <= 0) //不能没有桃子
			return -1;

		InputNumber -= 1;
		if ((InputNumber % 5) != 0) //拿走1个桃子,余下的还能分成5堆
			return -1;

		MidNumber = InputNumber / 5; //分出的每一堆不能是空
		if (MidNumber == 0)
			return -1;

		InputNumber -= MidNumber; //拿走一堆桃子
	}

	return InputNumber;
}

int main()
{
	int i;

	for (i=0; ; i++)
	{
		if (divide(i) > 0)
			break;
	}

	printf("猴子分桃问题的答案是:%d\n", i);

	return 0;
}


2.如何从[1-7]范围的数构造更大范围的数呢?同时满足这个更大范围的数出现概率是相同的,可以想到的运算包括两种:加法和乘法

考虑下面的表达式:7 * (rand7() – 1) + rand7();

可以计算得到上述表达式的得到的等概率随机数的范围是[1, 49] 。

下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢?

可以想到的方法就是 rejection sampling 方法,即生成[1, 49]的随机数,如果数的范围不在[1, 10]内,则重新取样。

解决方法:

int rand10()

{

int val = 0;

do {

    val = 7 * (rand7() - 1) + rand7();

} while (val > 10);

return val;

}

归纳总结:

将这个问题进一步抽象,已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数,m < n && n <= m *m 一般解法:

int random_n()

{

int val = 0 ;

int t; // t为n最大倍数,且满足 t &lt;= m * m

do {

    val = m * (random_m() - 1) + random_m();

} while (val > t);

return val;

}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

九月腾讯,创新工场,淘宝等公司最新面试十三题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭