/*
* 编号0~n-1的n个数,随机指定一个数m,从0开始报数,当报到m-1时,m-1出局。
* 然后从出局的那个数的下一个数开始报数,第m个数出局,直到剩下最后一个数。
*/
import java.util.*;
public class LastRemaining_Solution {
//法一的规律比较难找
public int lastRemaining_Solution(int n, int m) {
if(n == 0 || m == 0) return -1;
int last = 0;
for(int i = 2;i <= n;i ++) {
last = (last + m) % i;
}
return last;
}
//法二的思想比较容易理解
public int lastRemaining_Solution2(int n, int m) {
if(n == 0 || m == 0) return -1;
List<Integer> list = new ArrayList<Integer>();
for(int i = 0;i < n;i ++) {
list.add(i);
}
int k = 0;
while(list.size() > 1) {
//找到第m个元素的位置
k += m;
k = (k % list.size()) - 1; //list的size会变
if(k < 0) {
//System.out.println(list.get(list.size() - 1));
list.remove(list.size() - 1);
k = 0;
}
else{
//System.out.println(list.get(k));
list.remove(k);
}
}
return list.get(0);
}
public static void main(String[] args) {
System.out.println(new LastRemaining_Solution().lastRemaining_Solution2(5, 3));
}
}
《剑指offer》-约瑟夫环问题
最新推荐文章于 2022-03-29 11:01:24 发布