题目描述:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
首先拿到题目先考虑要把这n-1个数放到哪里操作比较方便,我这里考虑使用ArrayList集合,先把n个元素放到集合中
public static int moveZeroes(int n,int m) {
ArrayList<Integer> list=new ArrayList<>();
for (int i=0;i<n;i++){
list.add(i);
}}
下面是核心代码
int k=-1;//用变量k来控制每次移除元素的下标,由于要算上k本身的问题,所以从-1开始
int i=0;
while (list.size()!=1&&i<n-1){//当list的size为1时说明已经移除了n-1个元素,只剩下最后一个,我们直接返回即可
while (i<n-1){//一共要移动n-1次才能剩下最后一个
k=((k+1)%list.size()+(m-1))%list.size();//每移动一次直接让k到达要移除的下标位置
list.remove(k);//移除该位置的元素
i++;//进行下一次移动
k--;//保证k下次开始时会把自身算作1次,否则就会多往后移除一个元素
}
}
return list.get(0);//循环结束,直接返回最后一个元素