面试题1

来源:互联网 发布:最好的pdf阅读器 知乎 编辑:程序博客网 时间:2024/05/27 00:32

1.五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?

分析与解:

设开始有x个桃子,我们把x写成(x+4)-4.

第一个猴子来了,吃掉1个,还有桃子

(x+4)-4-1=(x+4)-5,

这时恰好可分成5份,每份的桃子数为

[(x+4)-5]/5=(x+4)/5-1

(x+4)/5必须为整数,所以(x+4)是5的倍数,

第一个猴子藏掉一份后,剩下的桃子为:

(4/5)×[(x+4)-5]=(4/5)×(x+4)-4

同样,第二个猴子来了,一吃一藏之后,剩下的桃子数为

(4/5)×[(4/5)×(x+4)-5]

由于(4/5)×(4/5)×(x+4)是整数,故(x+4)应是5×5=25的倍数,

如此一来五个猴子一吃一藏,恰好剩下

(4/5)×(4/5)× (4/5)×(4/5) ×(4/5) ×(x+4)-5个桃子,

故(x+4)必须是5×5×5×5×5的倍数,

即x+4=5^5

 所以: x=3125-4=3121

即开始最少有3121个桃子.

而我采用的是从小到大求解符合条件的数,方法比较笨。代码如下:

int i = 0, count, tmp;while(1){tmp = ++i;for(count = 0; count < 5; count++){tmp = ((tmp-1) % 5 == 0)?(tmp-1)/5*4:-1;if(tmp <= 0)break;}if(count == 5)break;}printf("The result is %d\n", i);

2.已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。

(参考答案:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:

1.rand7执行两次,出来的数为a1.a2.

2.如果a1*7+a2<40,b=(a1*7+a2)/10+1,如果a1*7*a2>=40,重复第一步)

代码如下:

int rand7(){  return rand()%7+1;}int rand10(){  int a1,a2,b;  do   {    a1= rand7()-1;    a2 = rand7()-1;    b = a1 *7 + a2;  } while (b >= 40);  return b/4+1;}

3.如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。
思路1:先对两个字符串进行排序,然后进行比较。
思路2:先创建一个字符数组为:hash[256] = {0},让第一个字符串进行映射,并使位置加1,然后对另外一个字符串也进行映射,如果映射的位置为0,则不匹配,否则让映射的位置减1,直到结果。
思路3:思想和思路2一样,但是是建立一个位映射而不是数组,这样就减少了占用的内存空间。

原创粉丝点击