【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