n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。
本题目就是已知 n,k 的情况下,求最后剩下的人的编号。
题目的输入是一行,2个空格分开的整数n, k
要求输出一个整数,表示最后剩下的人的编号。
约定:0 < n,k < 1百万
例如输入:
10 3
程序应该输出:
4
本例使用linkedList链表则可以轻松实现元素的移动。而不用通过设置游标来实现。
//频繁增删,使用链表
LinkedList<Integer>list=new LinkedList<Integer>();
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int k=scanner.nextInt();
for(int i=1;i<=n;i++)
list.add(i);
int count=1;//报数
while(list.size()>1) {
//当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
if(count==k) {
count=1;
list.removeFirst();
//System.out.print(list.removeFirst()+" ");
}
else {
list.add(list.removeFirst());//如果当前报数的人编号不是k,则将它移除出队列并加到队伍的末尾
count++;
}
}
System.out.println(list.getLast());