题目
0,1,2…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次2、0、4、1,因此最后剩下的数字是3。
本题就是有名的约瑟夫(Josephuse)环问题。
分析
两种解题方法:
- 用环形链表模拟圆圈的经典解法
- 分析每次被删除的数字的规律并直接计算出圆圈中最后剩下的数字
放码
一
用环形链表模拟圆圈的经典解法
public int lastRemaining(int n, int m) {
if(n < 1 || m < 1) {
throw new IllegalArgumentException();
}
LinkedList<Integer> list = new LinkedList<>();
for(int i = 0; i < n; i++) {
list.add(i);
}
int count = 0, index = 0;
while(list.size() >