个人理解
孩子们的游戏(圆圈中最后剩下的数)
http://www.nowcoder.com/questionTerminal/f78a359491e64a50bce2d89cff857eb6
第一次有人出圈,剩下的人组成新环,相当于前移了m位,设在旧环中喊号的次序为old_order
在新环喊号的次序为new_order = (old_order - m + old_num ) % old_number
递推有 old_order % old_num = (new_order + m) % old_num
又,0 <= old_order < old_num
得,old_order = (new_order + m) % old_num
同时,可以得出以下关系:
sum-1环的第一次出环 对应 sum环的第二次出环
又由新旧环次序对应关系得
f(sum)表示sum环的最后剩下数字编号
f(sum-1)表示sum环经过一次出环,sum-1环的最后剩下数字编号
他们是同一个人,只是要经过新旧环次序关系转换,从旧到新转换,就是一次出环
实例,n=9,m=4
起始号:0 1 2 3 4 5 6 7 8
初始环:0 1 2 3 4 5 6 7 8
新次序:5 6 7 0 1 2 3 4
旧环的第2次出环是起始号7,旧次序7
新环的第1次出环是起始号7,新次序3
class Solution {
public:
int func(int n, int m) {
if ( 1 == n ) {
return 0;
}
return (func(n-1, m) + m) % n;
}
int LastRemaining_Solution(int n, int m) {
if ( 0 == n || 1 > m ) {
return -1;
}
return func(n,m);
}
};
查看20道真题和解析
