• 阿里巴巴面试题




    /**
     * 阿里巴巴面试题
     * 有一堆石子共100枚,甲乙轮流从该堆中取石子,每次可以取2、4或6枚,取得最后的石子的玩家为赢家,若甲先取,则:
     *   A 谁都无法必胜
     *   B 乙必胜 
     *   C 甲必胜
     *   D 不确定
     *   闲来蛋疼就做这道题试试       思路分析
     * 假设每人都只能取2枚,那么一共可以取50次,所以甲先取的话,那么最后一次必然是乙
     * 同理,若每次只能取4枚,那么一共可以取25次,所以甲先取,最后一次必然是甲,但是若每次取6枚的话,那么就不能整除,
     * 所以,此题难在关键不确定每次甲或乙会取几个,但是我们可以看到一个共性,如果取石子的次数是奇数的话,那么必然是甲胜,若取石子
     * 的次数是偶数的话,那么必然是乙胜,看看每次甲和乙取石子的组合有哪些:
     *首先,甲每次有三种选择,乙也每次有三种选择,所以一共是3*3=9种选择
     * A:甲 2 乙 2 和是 4
     * B:甲 2 乙 4 和是 6 或者 甲 4 乙 2 和是 6
     * C:甲 2 乙 6 和是 8 或者 甲 6 乙 2 和是 8
     * D:甲 4 乙 4 和是 8
     * E:甲 4 乙 6 和是10 或者 甲 6 乙 4 和是 10
     * F:甲 6 乙 6 和是 12
     *由上分析可以看出 100/4=25可以整除,100/6=16余4,100/8=12余4,100/10=10可以整除,100/12=8余4
     *所以我们假设甲先取4个,那么剩下96个,因为96是8的倍数,所以无论乙取几个,甲只要取(8-乙取的)个石子,就必然能保证96/8=12,最后必然是甲胜
     *同理我们再次假设甲先取2个,那么剩下98个,不能整除8,余2,所以最后一次是乙取,所以必是乙胜
     *我们再假设甲先取6个,那么剩下94个,不能整除8,余6,所以不确定是甲胜还是乙胜,因为最后剩下的6个乙可以取完,也可以不取完,完全看乙的选择而定,所以选A
     */
    //以下程序测试在甲先取4个的情况
    public class AliBabaTest {
    public static void main(String[] args) {
    int numOfA;//表示甲取的个数
    int numOfB;//表示乙取的个数
    int num = 96;//表示甲先取4个之后,剩余的石子总数
    int count = 1;//计数器
    while(num!=0){
    int random = (int) (3*Math.random());//[0,1),[0,3)
    //random产生的随机数,每次都是0、1或2,如果是0,那么就假设乙取2个,如果是1就假设乙取4个,如果是2就假设乙取6个
    if(random==0){
    numOfB = 2;
    numOfA = 8-numOfB;
    num -= 8;
    System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
    count++;
    }else if(random==1){
    numOfB = 4;
    numOfA = 8-numOfB;
    num-=8;
    System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
    count++;
    }else if(random==2){
    numOfB = 6;
    numOfA = 8-numOfB;
    num -= 8;
    System.out.println("第"+count+"轮-->"+"乙取了:"+numOfB+"个石子,甲取了:"+numOfA+"个石子");
    count++;
    }else{
    System.out.println("随机数产生错误...");
    }
    }
    System.out.println("甲获得了胜利...");
    }
    }
    /**
     * 以下是某次的运行结果:
    第1轮-->乙取了:6个石子,甲取了:2个石子
    第2轮-->乙取了:2个石子,甲取了:6个石子
    第3轮-->乙取了:6个石子,甲取了:2个石子
    第4轮-->乙取了:2个石子,甲取了:6个石子
    第5轮-->乙取了:4个石子,甲取了:4个石子
    第6轮-->乙取了:6个石子,甲取了:2个石子
    第7轮-->乙取了:4个石子,甲取了:4个石子
    第8轮-->乙取了:6个石子,甲取了:2个石子
    第9轮-->乙取了:6个石子,甲取了:2个石子
    第10轮-->乙取了:2个石子,甲取了:6个石子
    第11轮-->乙取了:6个石子,甲取了:2个石子
    第12轮-->乙取了:2个石子,甲取了:6个石子
    甲获得了胜利...
     */ 


    //此题剩下的最大疑问点就是为什么选择了8(指的是每次甲乙一轮取得石子数之和)这个神奇的数字,这是因为8是比6大的最小的偶数,假设选择的数比6小,那么乙取了6个之后,甲就没办法取了,
    //又假设选择的数比8大,那么乙取了2个之后,甲最大也只能取6,所以一样没办法取了
    //若有遗漏之处,还望补充

  • 相关阅读:
    SpringCloud学习教程
    Google浏览器插件推荐
    谷歌身份验证器使用
    js控制某个div在页面加载完成5秒后隐藏
    通过城市联动实时将地址显示到text中
    百度地图通过地址查询并且定位
    yii2.0验证码的两种实现方式
    yii2.0 中数据查询中 or、in、between 及session的使用
    Calling unknown method: appmodulesmobilecontrollersCompanyController::redirect()
    页面权限跳转
  • 原文地址:https://www.cnblogs.com/riskyer/p/3341681.html
Copyright © 2020-2023  润新知