【Java算法】进3退一
来源:互联网 发布:数据速率和总比特率 编辑:程序博客网 时间:2024/05/17 21:49
算法心得:
1、花费了一晚上和一上午
2、要把整个过程分析透彻。
3、要把整个过程模拟的很清楚,就像把发生的过程中每一步,都要描述一遍,当然描述是用程序来说的。是用循环来做的。
算法过程:
需要参数:
1 i,做为数组下标
2、j,做为数到3的记数
3、quitnum,做为退出人的记数
逻辑情况:
1、当退出的时候,数组元素如何处理(让其等于0)
2、当 i 算到最后时,如果能返回i- 0重新计算(i = i - group.length),这样就算i超出了一个,仍然算到了i - 1头上。
3、每当 j 要加的时候,当j = 3后,j的后一个和后二个肯定不会退出。所以在j =3后,j后两个元素可以忽略。
4、如果 出现3的情况,一定要判断 j 后边的元素是否退出,也即group[i]是否为0,所以需要在每一次j++的前面,都要判断,如果后面的已经退出,则使用continue关键字。不用j++了。但是i还是要加。
5、相应的,i++后面,group前面,一定要判断,是否超出边界了,如果超出,则i = i - group.length.
6、在任何时候,一但出现有人退出的情况,要让quitnum++,一但quitNum判断,还剩下一个人(
if (quitNum == group.length - 1))
那边就啥也不做了,赶紧break,退出循环,并在下边 的处理中,把最后的这个人的 i 记录并return出去。
思路历程:
刚开始反反复复在修改,但是慢慢就确定了参数和逻辑。
程序真的是一步步先有个大概,然后不断的去摸索事实,用程序去最大限度的模拟事实,才算出来的。
package chapter5;public class Count3Quit {public static void main(String[] args) {int[] group500 = null;System.out.println("generate Array... ");group500 = generateArray();System.out.println("generate Array successful... ");System.out.println("the Array length is: " + group500.length);System.out.println("the Array is:");for (int i = 0; i < group500.length; i++) {System.out.print(group500[i] + " ");}System.out.println();System.out.println("count 3 then quit...");System.out.println("the one who is be left finally is:");System.out.println(count3Quit(group500));}public static int[] generateArray() {int[] group500;group500 = new int[8];for (int i = 1; i <= group500.length; i++) {group500[i - 1] = i;}return group500;}public static int count3Quit(int[] group) {int quitNum = 0;// 退出人的数目for (int i = 0, j = 1;; i++) {if (i >= group.length) {i = i - group.length;}// System.out.println(group.length);if (group[i] == 0) {System.out.println(i + " is quit...");continue;}if (j == 3) {// in fact, when group[i] is quit, the// program should continue(skip).group[i] = 0;quitNum++;if (quitNum == group.length - 1) {break;}j = 1;i++;}if (i >= group.length) {i = i - group.length;}// System.out.println(group.length);if (group[i] == 0) {// 应该写在j前,只要group[i] == 0,j就不应该加1System.out.println(i + " is quit...");continue;}j++;}int leftNum = -1;// 最后留下来的号for (int i = 0; i < group.length; i++) {if (group[i] != 0) {leftNum = i;// 最后留下来的号}}return leftNum;}}
0 0
- 【Java算法】进3退一
- 逢3退1的Java算法(双向回环链表算法)
- 显示回退的暴力字符串匹配算法.java
- java 数3退1游戏 实现
- java代码--数3退1
- Java编程 数3退1
- 【java】逢3退1小练习
- java代码for循环实现:500人围成一圈,数3退一,求最后留下的人的最初位置
- java代码while循环实现:500人围成一圈,数3退一,求最后留下的人的最初位置
- java代码面向对象实现:500人围成一圈,数3退一,求最后留下的人的最初位置
- Java算法(一)
- Java 算法题 一
- JAVA 算法(一)
- java实现退格
- java 耗油退件
- 程序闪退情景一
- java数据结构及算法一
- Java实现排序算法(一)
- org.springframework.web.servlet.DispatcherServlet
- Linux服务器开发之:chmod()函数,chmod命令,以及文件屏蔽umask命令,程序修改umask,详细介绍+案例演示
- friso分词器的应用
- cocos2d-x绑lua的开发环境
- TI 蓝牙协议栈视频学习笔记
- 【Java算法】进3退一
- Spring 详解
- UNIX环境高级编程学习环境搭建---apue.h
- ubuntu利用dd命令备份系统
- c程序的编译过程
- Trie树与后缀树
- [百度笔试] 2014百度校园招聘软件研发题--武汉
- Word Break II
- 16. 事件