- package com.heima.test;
- import java.util.ArrayList;
- public class Test13_约瑟夫环升级版 {
- /*
- * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。
- * 问:最后剩下的是100人中的第几个人?
- */
- public static void main(String[] args) {
- System.out.println(getLuckyNum(100)); //有多少人,参数就传多少
- }
-
- /*
- * 获取幸运数字
- * 方法
- * 返回值类型 int
- * 参数列表 int num
- */
- public static int getLuckyNum(int num) {
- ArrayList<Integer> list = new ArrayList<>(); //首先有一个有序集合list来存储人
- for (int i = 1; i <= num; i++) { //把人装进集合中,传入多少,就有序装多少
- list.add(i);
- }
-
- int count = 1; //用来报数,从1开始
- for (int i = 0; list.size() > 1; i++) { //因为只需要剩一个人,所以,集合中的元素个数只要大于1
- //这个循环就一直进行
- if (count == 15) { //到14之后,14退出.其他人要重新开始开始报数
- count = 1; //所以只要count等于了15,就把count置为1
- }
- if (i == list.size()) { //报数的人我们是通索引获取,只要索引等于了list.size()
- i = 0; //把索引置为0,就相当于排成一个圈
- }
- if (count == 14) { //如果报数报到14
- list.remove(i--); //报数的这个人就退出,同时,后边的人向前挪一位,所以i--
- }
- count++; //每次报数都会++;
- }
- return list.get(0); //到最后只剩一个人,就是list.get(0)索引对应的值.
- }
- }
复制代码 这就是约瑟夫环,代码其实可以继续优化,这样做显得太麻烦了,你可以参考一下我写的. |