public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        boolean []visited=new boolean[n];
                //初始化标记数组,false为在圈中,true为已经挑出圈中,不参加游戏
        for(int i=0;i<n;i++)
        {
            visited[i]=false;
        }
                //begin 为每一轮开始报数的第一个人编号 
        int begin=0;int j;
                //总共进行n-1次完整的报数
        for(int i=0;i<n-1;i++)
        {
            int count=0;
                        //第i轮报数
            for(j=begin;;j=(j+1)%n)
            {
                                  //如果还在圈内,则访问,并计数器coun加1 
                if(visited[j]==false)
                {
                    count++;
                }
                                //m个人都报数完毕,则挑出编号为j 的人出圈,并置标记数组 visited[j]为true
                if(count==m) {
                    visited[j]=true;
                    break;
                }
            }
                        //跳过后面已经出圈的人
            while(visited[(j+1)%n]==true)
            {
                j=(j+1)%n;
            }
                        //置下次开始报数的值为j+1取余,进行下一轮报数
            begin=(j+1)%n;
        }
                //挑出最后仍在圈中的人,即visited = true 的那个人,返回他的编号 
        for(int k=0;k<visited.length;k++)
        {
            if(visited[k]==false)
            {
                return k;
            }
        }
        return -1;
    }
}