方法一:模拟删除法(这里使用列表(list)代替数组来进行删减操作)
如果用数组模拟操作的话,删除数据涉及大量的数据搬移操作。
import java.util.*;

public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<1) return -1;
List<integer> list = new ArrayList<integer>();
for(int i=0;i<n;i++){
list.add(i);
}</integer></integer>

    int index=0;
    while(n>1){
        index=(index+m-1)%n;
        list.remove(index);
        --n;
    }
    return list.get(0);
}

}

方法二:递归
假设f(n, m) 表示最终留下元素的序号。比如上例子中表示为:f(5,3) = 3

首先,长度为 n 的序列会先删除第 m % n 个元素,然后剩下一个长度为 n - 1 的序列。那么,我们可以递归地求解 f(n - 1, m),就可以知道对于剩下的 n - 1 个元素,最终会留下第几个元素,我们设答案为 x = f(n - 1, m)。

由于我们删除了第 m % n 个元素,将序列的长度变为 n - 1。当我们知道了 f(n - 1, m) 对应的答案 x 之后,我们也就可以知道,长度为 n 的序列最后一个删除的元素,应当是从 m % n 开始数的第 x 个元素。因此有 f(n, m) = (m % n + x) % n = (m + x) % n。

当n等于1时,f(1,m) = 0

public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        if(n<1) return -1;
        return f(n,m);
    }

    int f(int n,int m){
        if(n==1) return 0;
        int x = f(n-1,m);
        return (x+m)%n;
    }
}