class Solution {
public int lastRemaining(int n, int m) {
// 模擬法
List<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
list.add(i);
}
int idx = 0;
while (n > 1) {
idx = (idx + m - 1) % n; // 下一個刪除的位置. 減1是因爲當前刪完之後,遊標會左移一位
list.remove(idx);
n--;
}
return list.get(0);
}
}
約瑟夫環: (當前index + m) % 上一輪剩餘數字的個數
class Solution {
public int lastRemaining(int n, int m) {
int ans = 0;
// 最後一輪剩下2個人,所以從2開始反推
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans;
}
}