跳到主要内容

简述Java实现约瑟夫问题 ?

参考答案:

约瑟夫问题(Josephus Problem)是一个著名的理论问题,通常描述为:有n个人围成一圈,从第一个人开始报数,每次数到m的人会被杀死并移出圈子,然后从下一个人开始继续报数,直到所有人都被杀死。求每次被杀的人的顺序。

下面是一个使用Java实现的约瑟夫问题的解决方案,采用链表的方式模拟整个过程:

import java.util.LinkedList;

public class JosephusProblem {
    public static void main(String[] args) {
        int n = 10; // 人数
        int m = 3; // 报数到m的人会被杀死
        LinkedList<Integer> list = new LinkedList<>();

        // 初始化链表
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }

        // 开始模拟
        while (list.size() > 1) {
            // 找到需要被杀死的人
            for (int i = 1; i < m; i++) {
                list = list.subList(1, list.size());
            }
            // 杀死并移除这个人
            System.out.println(list.removeFirst());
        }

        // 输出最后一个存活的人
        System.out.println(list.removeFirst());
    }
}

这个解决方案使用了一个LinkedList来模拟围成一圈的人。开始时,我们初始化一个包含1到n的链表,然后开始模拟报数和杀人的过程。在每次循环中,我们找到需要被杀死的人(即链表的第m个元素),然后将其从链表中移除,并输出其编号。这个过程一直持续到链表中只剩下一个元素为止,这个元素就是最后存活的人。