今天在牛客网刷了一道题目,如下
据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。
本人看了一下别人的解题方法,有些解法不太理解,有些解法太复杂,直到看到一个C语言的解法,虽说运行占用的内容空间比较大,但容易理解,可惜没有用Java实现的,在这里本人用Java实现一下。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
//初始化队列
Queue<Integer> queue = new LinkedList<>();
//向队列中添加元素
for (int i=1; i<=n; i++){
queue.offer(i);
}
//判断队列的元素是否为1
while (queue.size() != 1){
//向队列尾部添加队列前m-1个元素,同时删除队列前m-1个元素
for (int i=1; i<m; i++){
queue.offer(queue.poll());
}
//删除队列第m个元素
queue.poll();
}
//如果队列只有1个元素,输出元素,不删除队列元素
System.out.println(queue.peek());
}
}
在牛客网的解法链接:https://www.nowcoder.com/questionTerminal/c3b34059faf546d3a7ee28f2b0154286?toCommentId=6255800
当然还有更好的解法,但我认为此方法是比较容易理解,可能是因为本人的能力有限吧,欢迎大家来讨论。