一.题目概述
约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为1第二个人的编号为2号,第三个人的编号为3号,第N个人的编号为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?
二.解题流程
1.问题重述
通过阅读题干,我们可总结出本题的关键信息:
N个人围成一个圈,编号由一到N ,报到M 的人出局直到剩最后一个人,求出局的顺序。
2.分析问题
首先,要求出局的顺序,说明要按出局顺序输出这N个人的编号,所以我们先要存储N个人的编号,存储已知个数的数据,首先想到的是数组,但数组开辟的固定空间无法释放,若N的值非常大,会造成空间占用过大,此时可以想到用链表存储这N个数据,可通过释放节点空间进行空间节约,同时在出局操作中链表也更便捷。
解决了存储问题后,第二步我们要考虑的便是如何淘汰报数到M的人,这里的解决方法根据存储方式的不同而不同,我们下面对数组和链表分别进行分析。
3.解决问题
1.普通数组法
最直接的思路便是把N个人的编号存储到大小为N的数组中。
因为题目要求从1开始报数,所以我们可以从数组的下标1开始存储,不使用下标0。