/**
* 阿里巴巴面试题
* 有一堆石子共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,所以一样没办法取了
//若有遗漏之处,还望补充
阿里巴巴面试题
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
阿里巴巴 前端面试题
题目大概是这样的:[javascript] view plaincopyfunction outer(){ return inner;
函数声明 javascript 解析器 -
阿里巴巴前端面试题29问JavaScript
-
阿里巴巴测试开发岗面试题
阿里巴巴测试开发岗面试题
java 外包 性能测试 python -
阿里巴巴算法面试经验分享(附面试题及答案)
算法面试经验分享!
计算机视觉 机器学习 商业模式 -
阿里Java高级面试题,你离阿里巴巴还有多远?
阿里Java高级面试题,你离阿里巴巴还有多远
数据 java 服务器 数据库 协调者 -
阿里巴巴电话面试
半个小时左右的电话面试,问题不是太难,算法和数据结构是薄弱环节。1.现在主要在做
面试 map容器 复杂度 数据结构