面试题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