题目描述
题目抽象:给定一个由[0...n-1]构成的数组,第一次从0开始数m个数,然后删除,以后每次都从删除的数下一个位置开始数m个数,然后删除,直到剩余一个数字,找出那个数字。
比如:arr = [0 1 2 3 4], m = 3
第一次:删除2 ,变成 arr = [0 1 3 4]
第二次,删除0,变成 arr = [1 3 4]
第三次,删除4,变成 arr = [1 3]
第四次,删除1,变成 arr = [3]
解题方法
借助队列一般涉及到这种循环移位,都可以借助队列来实现。移除队首可加入队尾

import java.util.LinkedList;
import java.util.Queue;


public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        if (n == 0) {
            return -1;
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            queue.add(i);
        }
        while (queue.size() > 1) {
            for (int i = 0; i < m - 1; i++) {
                queue.add(queue.poll());
            }
            queue.remove();
        }
        return queue.remove();
    }
}