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)+"\n值为:"+map.get(list.get(0)));
}
}