九月騰訊,創新工場,淘寶等公司最新面試十三題

  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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章