约瑟夫问题

package test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
//约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
//从编号为k的人开始报数,数到m的那个人出列;
//他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
/**
 * 题目:有一个整型数组a[n]顺序存放0 ~ n-1,要求每隔两个数删掉一个数,
 * 到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
*
 */
public class Yuesefu {
    public static void main(String[] args) {
        yue(10,3,1);//元素个数,间隔个数,开始位置
    }
    
    public static void yue(int total,int count,int no){
        HashMap<Integer,Object> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=1;i<total+1;i++){
            list.add(i);
            map.put(i,(int)(Math.random()*10));
        }
        System.out.println(list);
        int k = no-1 + count - 1;//删除元素的下标:首次下标+间隔 -1
        while(list.size() > 1){
            if(k > list.size()-1){//需要回环
              k = k - (list.size()-1) -1;//计算下标
            }
            System.out.println(list.get(k));
            list.remove(k);
            k = k+count-1; //计算下标
            System.out.println(list);
        }
        Collection<Object> values = map.values();
        for (Object object : values) {
            System.out.print(object+"|");
        }
        System.out.println();
        System.out.println("原始下标:"+list.get(0)+" 值为:"+map.get(list.get(0)));
    }
    
}

原文地址:https://www.cnblogs.com/caoyajun33-blog/p/7505800.html