面试题1(转)
来源:互联网 发布:js常用正则表达式 编辑:程序博客网 时间:2024/06/15 13:44
一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最
大的一颗?
原理:取前n层的钻石的平均值avg,从第n+1层开始,如果遇到大于avg的钻石,则取之。(参考前面的回复的)
测试结果:
当n为 1 的时候,找到最大值的比例为: 126873/1000000
当n为 2 的时候,找到最大值的比例为: 126945/1000000
当n为 3 的时候,找到最大值的比例为: 126687/1000000
当n为 4 的时候,找到最大值的比例为: 127257/1000000
当n为 5 的时候,找到最大值的比例为: 256684/1000000
当n为 6 的时候,找到最大值的比例为: 126895/1000000
当n为 7 的时候,找到最大值的比例为: 126946/1000000
当n为 8 的时候,找到最大值的比例为: 126702/1000000
当n为 9 的时候,找到最大值的比例为: 126923/1000000
所以,取得前面5层作为平均值的时候,找到最大那颗钻石的概率最大,大约是0.25
实现代码:
package test;import java.util.Arrays;import java.util.Random;/** * 原理:取前n层的钻石的平均值avg,从第n+1层开始,如果遇到大于avg的钻石,则取之。 */public class Demo { private static int before;// 取前多少层的平均值 private static int[] diamonds = new int[10];// 十颗钻石 public static void main(String[] args) { // 分别计算当n为1~9层的时候对应取得最大值的概率 for (int x = 1; x < 10; x++) { before = x; int count = 1000000;// 测试次数 int countMax = 0;// 找到最大值的次数 // 测试count次,计算取得的钻石为最大值的出现比例 for (int i = 0; i < count; i++) { // 初始化十颗钻石 resetDiamonds(); // 开始,获取钻石 int diamond = getDiamond(); if (isMax(diamond, diamonds)) { countMax++; } } // 计算出现最大值的比例 System.out.println("当n为 " + before + " 的时候,找到最大值的比例为: " + countMax + "/" + count); } } /** * 计算是否获得了最大值 */ private static boolean isMax(int diamond, int[] diamonds) { Arrays.sort(diamonds); if (diamond == diamonds[diamonds.length - 1]) { return true; } return false; } /** * 还是上楼,获取钻石 */ private static int getDiamond() { int diamond = 0; // 计算前n层钻石的平均值avg int avg = getAvg(); // 遍历后面的楼层的钻石 for (int i = before; i < diamonds.length; i++) { if (diamonds[i] > avg) { diamond = diamonds[i]; break; } } // 如果没有遇到大于avg的,则取最后一颗 if (diamond == 0) { diamond = diamonds[diamonds.length - 1]; } return diamond; } /** * 初始化/重置钻石,值为80~100 */ private static void resetDiamonds() { Random r = new Random(); for (int i = 0; i < diamonds.length; i++) { diamonds[i] = r.nextInt(20) + 80; } } /** * 取得前n层楼的平均值 */ private static int getAvg() { int sum = 0; for (int i = 0; i < before; i++) { sum += diamonds[i]; } return sum / 5; }}
0 0
- 面试题1(转)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- 面试题(1)
- Linux面试题(转)(1)
- 【面试题】 单链表的热点面试题(1 )
- .net面试题1(转)
- [转]JAVA面试题1
- 一道面试题(转)
- c++ 面试题(转)
- (转)android面试题
- XSS的原理分析与解剖:第四章(编码与绕过)
- ubuntu 12.04 安装Sublime Text
- SVN冲突解决
- iOS子线程更新UI的两种方法
- Memcached技术
- 面试题1(转)
- poj 3667 Hotel(线段树中级,区间合并)
- Qt中forward declaration of struct Ui::xxx的解决
- 2D Transformations
- iso隐藏键盘的方法
- struts2和springMVC框架的比较
- 博客生命
- 进程的优先级&为什么使用服务
- SQL中CONVERT转化函数的用法