1. 题目描述
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
2. 思路
(1)解法一:
将数据存至数组中,计算每次需要移出的元素的索引,由于是圆形排列,所以需要通过取模的方式求下标;
直到数组内只剩一个元素,返回结果。
(2)解法二:递归分解思想
我们可以假设f(n,m)为所求的结果,首先,长度为 n 的序列会先删除第 m % n 个元素,然后剩下一个长度为 n - 1 的序列。那么,我们可以递归地求解 f(n - 1, m),就可以知道对于剩下的 n - 1 个元素,最终会留下第几个元素。
最终的递归终止条件为f(1,m)即为0。
3. 代码
(1)解法一:
class Solution {
public int lastRemaining(int n, int m) {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i=0;i<n;i++){
list.add(i);
}
int index = (m-1)%n;
while(list.size()>1){
list.remove(index);
index = (index+m-1)%list.size();
}
return list.get(0);
}
}
(2)解法二
class Solution {
public int lastRemaining(int n, int m) {
return recur(n,m);
}
public int recur(int n,int m){
if(n==1)//递归终止添加
return 0;
int index = recur(n-1,m);//求出被删除元素后的下一个值
return (m+index)%n;//返回答案
}
}