一 用双向链表模拟环来解决
import java.util.*;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n < 1 || m < 1){
return -1;
}
List<Integer> list = new LinkedList<Integer>();
for(int i = 0;i < n;i++){
list.add(i);
}
int current = 0;
while(list.size() > 1){
for(int i = 1;i < m;i++){
current++;
if(current == list.size()){
current = 0;
}
}
list.remove(current);
if(current == list.size()){
current = 0;
}
}
return list.get(current);
}
}
二 递归
public int LastRemaining_Solution(int n, int m){
if(n < 1 || m < 1){
return -1;
}
return (LastRemaining_Solution(n - 1, m) + m) % n;
}
三 循环
public int LastRemaining_Solution(int n ,int m){
if(n < 1 || m < 1){
return -1;
}
int last = 0;
for(int i = 2;i <= n;i++){
last = (last + m) % i;
}
return last;
}