社团共有 num 为成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。
示例 1:
输入:num = 7, target = 4
输出:1
示例 2:
输入:num = 12, target = 5
输出:0
0,1,2...n-2,n-1
,而 f(n-1) 就是 0,1,2...n-3,n-2
的环每次出局第 m 个人。接下来试着找一下联系,当 f(n) 的环经过一轮删除后,由于 m 可能大于 n,所以实际上删除了环上 (m-1)%n
位上的数,它的下一位是 (m-1)%n + 1 = m%n - 1%n + 1 = m%n
,(n 要是等于 1 你还找什么,所以 1%n 必定为 1),我们把 m%n 看做 t,删除的那位就是前一位即 t-1,此时的环可以用 t 表示成 t,t+1...0,1,...t-3,t-2
,f(n) 删除一轮,不就变成了 f(n-1) 的问题了吗,那么我们一一对照 f(n-1) 的环和我们用 t 表示的 f(n) 删除一轮后的环(x+t)%n
, public int lastRemaining(int n, int m) {
// f(1)
int x = 0;
// i 从 2 开始不断得到 f(2),f(3)...最终的 f(n)
for (int i = 2; i <= n; i++) {
x = (x + m) % i;
}
return x;
}