好久没有登录CSDN写东西了,真的是好久了,原因很简单,因为自己松懈了好久,懒惰了好久。以前要求自己每天一篇,那时候虽然算不得勤奋,最起码没有放弃学习。以后要慢慢恢复自己的学习状态。毕竟找工作难找啊,今天到用友的小分部看了看,主管大讲特讲的讲了很多,工作难找啊。
今天要写的是猴子选大王小程序,这是一个很经典的考题。有M只猴子彼此不服气都想争夺当猴王,打一架强者为王当然行,但和平静气的解决才是王道,解决办法就是猴子们站成一个圈,从1开始报数,每数到规定的N则将第N个猴子淘汰,然后继续从1报数继续按规则淘汰,剩着为王嘛,最后剩下的猴子就是猴王,这样各凭运气,听天之命谁也不要抱怨。问题知道了,想法缕顺了,怎么开始编程呢?
其实最简单的方法就是用一个循环链表,每次到第N个猴子remove()掉一个猴子,思路简单,代码少(代码后面会贴出),问题是List的好多语法忘记了咋办,那就用最简单的直接单数组实现。
那么问题来了,用数组怎么实现呢?将编号存在数组里,将下标当做报出的数字进行移动,下标从0开始,然后每到N时,将数组内的编号变为0,然后继续从0开始移动,当到数组末位的时候返回最前面开始数,当遇到编号为0的猴子时候,表示给猴子已经淘汰,跳过该猴子下标继续移动。
写了这么多汉字就知道这是比较笨的办法,最麻烦的就是条件的编写,哎,好久没接触Java,目前水平也就这样了。以下是具体代码:
public class monkey {
/*
* 猴子选大王,首先输入猴子数目,然后规定喊出的数字,最后确定哪个猴子是大王
*/
public static void main(String[] args) {
//输入猴子的数目
int num[] = new int[10];
for(int a=0;a<10;a++){ //给数组赋值
num[a]=a+1;
}
//规定喊出的数字5
int law = 5;
System.out.println("输入猴子的数目:10");
System.out.println("规定数字:5");
select(num,law); //根据规定选择大王
}
static void select(int num[],int law){
int king=0;
int index=1; //记录数组下表
int count=1;//第一个猴子从一开始数
int left=10;
while(left!=0){ //然后依次向下数
if(index==num.length+1){ //如果数到末位则返回重新数
index=1;
}
if(count==law&&num[index-1]!=0){ //当数到规定的数之后,猴子数量减一,继续从头开始数
num[index-1]=0;
left--;
count++;
if(count==law+1) count=1;
}
if(num[index-1]!=0){
count++;
if(count==law+1) count=1;
}
index++;
}
System.out.println("最后的猴子大王是:"+--index);
}
}
程序里面的注释已经很清楚了。运行结果是:
这个单数组的是比较笨的办法,我把其他的方法也贴出来,思路大家一看就都知道了。
private static void method2(int n,int a) {
Map map = new HashMap();
int p = 1; // 猴子编号
int c = 1; // 报数号
for (int i = 1; i < n + 1; i++) {
map.put(i, i);
}
while (map.size() > 1) {
if (c == 3) {
map.remove(p);
}
p++;
if (p == n + 1) {
p = 1;
}
if (map.get(p) != null) {
c++;
}
if (c == a + 1) {
c = 1;
}
}
String result = map.keySet().toString();
System.out.println("猴王的编号为:"+result.substring(1, result.length()-1));
}
这个是用到map的方法,传递的参数n表示猴子的数量,a表示规定的数字,每数到3的时候remove() 掉一个猴子,每次到map结尾的时候,回环继续报数。
最后这个简单的方法就是纯数学的推理了。
public static void method3(int a, int n) {
int index = 0;
for (int i = 2; i <= a; ++i) {
index = (index + n) % i;
}
System.out.println("猴王的编号为:"+(index+1));
}