方法一:模拟过程
class Solution {
public int lastRemaining(int n, int m) {
boolean[] arr = new boolean[n];
// 一开始所有都为true
for(int i = 0;i < n;i++){
arr[i] = true;
}
int personLength = n;
int countNum = 0;
int index = 0;
while(personLength > 1){
if(arr[index] == true){
// 报数
countNum++;
if(countNum == m){
// 重新开始报数
countNum = 0;
// 退出
arr[index] = false;
// 总人数减一
personLength--;
}
}
// 已经退出的话直接再向前一个
index++;
// 到末尾重新开始
if(index == n){
index = 0;
}
}
for (int i = 0; i < n; i++) {
if (arr[i] == true) {
return i;
}
}
return -1;
}
}
方法二:模拟过程进化版
class Solution {
public int lastRemaining(int n, int m) {
ArrayList<Integer> list = new ArrayList<>(n);
for(int i = 0;i < n;i++){
list.add(i);
}
int index = 0;
while(n > 1){
index = (index + m - 1) % n;
list.remove(index);
n--;
}
return list.get(0);
}
}