链接:剑指 Offer 62. 圆圈中最后剩下的数字
    比较好理解的方法:

    1. class Solution {
    2. public int lastRemaining(int n, int m) {
    3. List<Integer> list=new ArrayList<>();
    4. for(int i=0;i<n;i++){
    5. list.add(i);
    6. }
    7. int index=0;
    8. while(n>1){
    9. index=(index+m-1)%n;
    10. list.remove(index);
    11. n--;
    12. }
    13. return list.get(0);
    14. }
    15. }

    有一个数学方法:
    约瑟夫环——公式法(递推公式)
    可以推导得到公式
    f(1)=0
    f(2)=(f(1)+m)%2=1
    f(3)=(f(2)+m)%3=1
    f(4)=(f(3)+m)%4=0
    f(5)=(f(4)+m)%5=3
    每次去掉哪一个,相当于把数组中所有数字往前移动m位删掉最后一个
    所以最后活下来的那个数字,每一轮都在被往前移动m位
    因为最后只剩它一个的时候,index=0
    倒推得到最开始的下标

    1. class Solution {
    2. public int lastRemaining(int n, int m) {
    3. int index=0;
    4. for(int i=2;i<=n;i++){
    5. index=(index+m)%i;
    6. }
    7. return index;
    8. }
    9. }