算法心得:
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就不应该加1
System.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;
}
}