求职测试准备3

题目:

有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。

最近爱上EMC的测试了:)

解答:

网上一堆答案,搞得及繁琐无比,让我来化简吧。

设有x只老鼠,7天后有死亡和存活两种状态,因此能够提供的信息量为2x。解2x>1000即可。

on October 13th, 2008 | 2 Comments »

求职测试准备2

题目:

地面上有N个硬币,若干机器人在处理这些硬币。机器人首先随机选择一个硬币,若此硬币正面向上,则将其抛出;若此硬币反面向上则直接将其翻转。问最后硬币正反比例的情况。

据说题目来自EMC面试

解答:

假设最后硬币正反比例会稳定。设地面共有N个硬币,最终有Np个硬币正面向上。

稳定时,则每次机器人将一个硬币由正面翻为反面的概率应当等于它将一个硬币由反面翻为正面的概率。

则 1/2 * p = 1-p

解得 p = 2/3

检验硬币是否会稳定:初始时讨论p > 2/3和p < 2/3两种情况,易证p依概率收敛到2/3。

on October 9th, 2008 | 2 Comments »

求职测试准备1

题目:

写一个函数 int p(int x, int y),输出x到y再到x (假设x<y)

要求只用一个语句完成,不允许用?:等多元操作符和关键字。只能用一个printf库函数。

据说题目来自EMC笔试

解答:

此题难点显然在后面那些要求上。只用一个语句完成的要求很容易让人联想到函数递归。因此

int p(int x, int y){
    return printf("%d ", x)
        && (x<y && p(x+1, y));
}

可以完成从x打印到y的任务。

进一步的有

int p(int x, int y){
    return printf("%d ", x)
        && (x<y && p(x+1, y))
        || printf("%d ", x);
}

但是,值得注意的是题目要求只使用一个printf函数,因此,最后那个printf也必须改为递归语句,即

int p(int x, int y){
    return printf("%d ", x)
        && (x<y && p(x+1, y))
        || (x<y && p(x, x));
}

如果考虑x>y的情况,修改条件判断<为!=,修改p(x+1, y)为p(x+(y-x)/abs(y-x), y)即可

int p(int x, int y){
    return printf("%d ", x)
        && (x!=y && p(x+(y-x)/abs(y-x), y))
        || (x!=y && p(x, x));
}

点评:问题的关键在于递归、逻辑运算的短路原理。尤其是后者比前者更难想到。

on October 9th, 2008 | No Comments »