环形链表的约瑟夫问题
描述
编号为 1 到 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。
下一个人继续从 1 开始报数。
n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
解题
公式反推
反推过程:(当前index + m) % 上一轮剩余数字的个数 最终剩下一个人时的安全位置肯定为1,反推安全位置在人数为n时的编号 人数为1: 0+1 人数为2: (0+m) % 2+1 人数为3: ((0+m) % 2 + m) % 3+1 人数为4: (((0+m) % 2 + m) % 3 + m) % 4+1
/**
* 约瑟夫环问题
* 公式方法
*/
public class Solution {
public int ysf(int n,int m){
int res=0;
for (int i = 2; i <= n; i++) {
res = (res+m)%i;//反向求解
}
return res+1;
}
}