猴子选大王—Java单数组、map、数学计算实现
来源:互联网 发布:continue在c语言 编辑:程序博客网 时间:2024/06/06 02:40
好久没有登录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;}//规定喊出的数字5int 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));}
- 猴子选大王—Java单数组、map、数学计算实现
- 猴子选大王(java普通数组实现)
- 实现猴子选大王
- 猴子选大王 java中 linkedlist实现
- 猴子选大王——CSharp数组
- 数组-11. 猴子选大王
- 猴子选大王(约瑟夫问题)JAVA实现
- 数据结构实践——猴子选大王(数组版)
- 第九周——猴子选大王(数组版)
- 第九周项目一—猴子选大王(数组)
- 第九周 数据结构实践——猴子选大王(数组版) 【项目 - 猴子选大王(数组版)】
- PAT数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- 数组-11. 猴子选大王(20)
- string 与char* char[]之间的转换
- ccf 网络延时
- sizeof总结
- HTTP上传文件的boundary
- Explorer.exe 的命令行参数
- 猴子选大王—Java单数组、map、数学计算实现
- python异常处理
- hdoj 2032 杨辉三角
- Cocos2d-x:3.0和2.0之间的区别
- 从硬件负利到硬件免费,乐视用生态化反深度改造传统硬件行业
- PinnedSectionListView使用详解
- POJ 3093 背包 (技巧优化)
- 架构案例丨苏宁易购:商品详情系统架构设计
- Laravel 5.2 使用ckeditor