面试题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一样,但是是建立一个位映射而不是数组,这样就减少了占用的内存空间。
- [面试题] 随机数相关面试题(1)
- java面试题1
- JAVA面试题-1
- 华为面试题1
- C#面试题 1
- 英文面试题(1)
- 面试题1-- Intel
- C++面试题1
- 面试题(1)
- c# 面试题1
- 中兴面试题1
- .net面试题1
- 面试题1
- 面试题1
- .NET 面试题1
- java面试题1
- sql面试题(1)
- 面试题1
- 修改Sybase数据库sa密码的方法
- 《C#妹妹和Objective-C阿姨对话录》(03)NSString--再遇狗狗
- HDOJ 1021 Fibonacci Again
- #include <filename.h> 和 #include “filename.h”有什么 区别
- iOS5打开系统setting页面
- 面试题1
- 插上USB设备后,系统中没有找到设备
- 《C#妹妹和Objective-C阿姨对话录》(04)垃圾回收基础--拆迁队那点事
- 程序员常用网站汇总
- 代码学习笔记
- SecurityCRT连接虚拟机
- 一个很好的android学习网站,全是一些实用的例子
- [Android实例] Android实现开机自动运行程序
- 化妆品添加万种化学物质 美列出十大有毒化妆品