【Java算法】进3退一

算法心得:

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;
	}

}




                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不止鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值