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;
}
}