牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案

题目描述

据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环形链表得出最终存活的人的编号。

n 表示环形链表的长度, m 表示每次报数到 m 就自杀。

题解:

遍历环形链表,每遍历 m 个节点就删除一个节点,知道链表只剩下一个节点就可以了。

代码:

class Solution {
   
public:
    /** * * @param n int整型 * @param m int整型 * @return int整型 */
    int ysf(int n, int m) {
   
        // write code here
        int a=0;
        for(int i=2;i<=n;i++)
        {
   
            a=(a+m)%i;
        }
        return a+1;
    }
};