- 五隻猴子分桃。半夜,第一隻猴子先起來,它把桃分成了相等的五堆,多出一隻。於是,它吃掉了一個,拿走了一堆; 第二隻猴子起來一看,只有四堆桃。於是把四堆合在一起,分成相等的五堆,又多出一個。於是,它也吃掉了一個,拿走了一堆;......其他幾隻猴子也都是 這樣分的。問:這堆桃至少有多少個?(朋友說,這是小學奧數題)。
- 已知有個rand7()的函數,返回1到7隨機自然數,讓利用這個rand7()構造rand10() 隨機1~10。
- 給定一個字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求將其中交集不爲空的集合合併,要求合併完成後的集合之間無交集,例如上例應輸出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。
- 要求設計一個DNS的Cache結構,要求能夠滿足每秒5000以上的查詢,滿足IP數據的快速插入,查詢的速度要快。
- 一個未排序整數數組,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的 相對順序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求時間複雜度O(N),空間O(1) 。
- 淘寶面試題:有一個一億節點的樹,現在已知兩個點,找這兩個點的共同的祖先。
- 海量數據分佈在100臺電腦中,想個辦法高效統計出這批數據的TOP10。(此題請參考本博客內其它文章)。
-
某服務器流量統計器,每天有1000億的訪問記錄數據,包括時間、url、ip。設計系統實現記錄數據的
保存、管理、查詢。要求能實現一下功能:
(1)計算在某一時間段(精確到分)時間內的,某url的所有訪問量。
(2)計算在某一時間段(精確到分)時間內的,某ip的所有訪問量。 -
假設某個網站每天有超過10億次的頁面訪問量,出於安全考慮,網站會記錄訪問客戶端訪問的ip地址和對應的時間,如果現在已經記錄了1000億條數據,想統計一個指定時間段內的區域ip地址訪問量,那麼這些數據應該按照何種方式來組織,才能儘快滿足上面的統計需求呢,
設計完方案後,並指出該方案的優缺點,比如在什麼情況下,可能會非常慢? -
騰訊1.服務器內存1G,有一個2G的文件,裏面每行存着一個QQ號(5-10位數),怎麼最快找出出現過最多次的QQ號。
騰訊2.如何求根號2的值,並且按照我的需要列出指定小數位,比如根號2是1.141 我要列出1位小數就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 -
如果兩個字符串的字符一樣,但是順序不一樣,被認爲是兄弟字符串,問如何在迅速匹配兄弟字符串。
-
創新工場面試題:abcde五人打漁,打完睡覺,a先醒來,扔掉1條魚,把剩下的分成5分,拿一份走了;b再醒來,也扔掉1條,把剩下的分成5份,拿一份走了;然後cde都按上面的方法取魚。問他們一共打了多少條魚,寫程序和算法實現。提示:共打了多少條魚的結果有很多。但求最少打的魚的結果是3121條魚(應該找這5個人問問,用什麼工具打了這麼多條魚)。
- 淘寶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 <= m * m
do {
val = m * (random_m() - 1) + random_m();
} while (val > t);
return val;
}