- package com.heima;
- import java.util.ArrayList;
- public class Test7 {
- /*
- * 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)
- * 围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始
- * 报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
- */
- public static void main(String[] args) {
- System.out.println(lastOne(1, 3, 8));
- }
- // start代表编号为K,开始数数;end代表m,数到m那个人出列;sum总共有n个人
- public static int lastOne(int start, int end, int sum) {
- ArrayList<Integer> list = new ArrayList<>();
- //用集合模拟1,2,3,4..n个人围成一桌
- for (int i = 1; i <= sum; i++) {
- list.add(i);
- }
- int count = 1; //数数变量,记录当前已数到哪个数
- //start-1是因为集合索引从0开始,只要集合不只剩一个人就一直数数剔除人
- //i记录count数数变量所指的集合位置,也就是数到的人
- for (int i = start - 1; list.size() != 1; i++) {
- //数到圆圈中最后一个人,从剩下的第一人也就是集合索引为0的人继续
- if (i == list.size())
- i = 0;
- /*每数到第end个人数就剔除,i--是因为ArrayList集合底层数组实现,
- 每删除一个元素,后面的元素都会往前移一位,这样不会漏数i后面的第一个元素*/
- if (count % end == 0)
- list.remove(i--);
- count++; //往后数一个数
- }
- return list.get(0);//获取最后剩下一人的编号
- }
- }
复制代码 |