约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)在下面的代码中,解决的是n个人排成一圈,这n个人的序号分别是0 ~ n-1, 给定一个数m,从头开始报数,每报到m-1时,这个人出列,然后下个人从0开始报数,直到最后一个人留下,求最后一个人的序号。java实现代码如下:
public class YueSeFu {
public static void main(String[] args) {
int a = test(3,1);
System.out.println(a);
}
public static int test(int n,int m){
if(n==0 || m==0){
return -1;
}
if(n==1 && m==1){
return -1;
}
List<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++){
list.add(i);
}
int index = -1;
while (list.size()>1){
index = (index + m) % list.size();
/**
* 同样的,用动态数组存储数据,一个大循环就是数组不为空;
* 用 i 记录已走过的整个数组下标的最后一位(关于这句话,大家可能不太理解,
* 意思就是比如数组[1,2,3,4,5,6],当遍历到元素4时,下标为3,然后把4移除,
* 下标自减,让其改为2,指向元素3,而不是指向还未遍历到的元素5);
* 以count计数,到第k个就删去该元素,并且置count=0,i-- 使得下标回退一步。
* index--的意思就是退回到3的位置
*/
list.remove(index);
index--;
}
return list.get(0);
}
}