1.
五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,
它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一
起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几
只猴子也都是 这样分的。问:这堆桃至少有多少个?(朋友说,这是小学奥数题)。
参考答案:
剩余的桃子:
第1只猴子:x=x-(x-1)/5-1 == 4/5(x-1) 如果有1只猴子,那桃子数为:5^1-4
第2只猴子:x=x-(x-1)/5-1 == 4/5(x-1) 如果有2只猴子,那桃子数为:5^2-4
第3只猴子:x=x-(x-1)/5-1 == 4/5(x-1) 如果有3只猴子,那桃子数为:5^3-4
第4只猴子:x=x-(x-1)/5-1 == 4/5(x-1) 如果有4只猴子,那桃子数为:5^4-4
第5只猴子:x=x-(x-1)/5-1 == 4/5(x-1) 如果有5只猴子,那桃子数为:5^5-4
so,桃子数为5^5-4==3121
6.
淘宝面试题:有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。
这个一个考虑的是存储的问题,一个公共祖先的问题;
如果不能都存入内存,树存储在文件中,遍历到当前节点,如果当前节点不在内存中,从文件读入,再处理
寻找公共祖先问题,有LCA等算法;
转载个别人的算法,但是很明显从根开始遍历的,不好:
1、一个结点是另一个结点的祖先,这种情况第一个结点是两个结点的共同祖先;
2、第三个结点是两个结点的共同祖先。
递归遍历每个结点,
如果当前结点是空结点,返回NULL,
如果当前结点等于两个结点中的一个,返回当前结点指针
递归遍历当前结点的所有子树,返回n个结点指针,
如果只有一个指针非NULL,说明两个结点都在那棵子树中,返回那棵子树的指针,
如果有两个指针非NULL,说明当前结点是这两个结点的共同祖先,返回当前结点指针。
9.
假设某个网站每天有超过 10 亿次的页面访问量,出于安全考虑,网站会记录访问客户
端访问的 ip 地址和对应的时间,如果现在已经记录了 1000 亿条数据,想统计一个指定
时间段内的区域 ip 地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满
足上面的统计需求呢,
设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?
参考答案:
用 B+树来组织,非叶子节点存储(某个时间点,页面访问量),叶子节点是访问的IP地址。
这个方案的优点是查询某个时间段内的IP访问量很快,
但是要统计某个IP的访问次数或是上次访问时间就不得不遍历整个树的叶子节点。
或者可以建立二级索引,分别是时间和地点来建立索引。