圆圈中最后剩下的数
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
解题思路
这道题是著名的约瑟夫环问题。用一个数组arr来模拟环,找下标满足条件的元素删除,一直到数组只剩一个元素。代码的关键就是这一句,删除元素的下标表示
del = (del+m-1)%arr.length
第一次删除很好理解就是下标m-1处的元素。第二次呢?每m个元素删除最后一个,下标(m-1)+m=2m-1处的元素吗?注意!这时候数组已经更新了,前面少了一个数应该是(m-1)+m-1处的元素,第三次就是((m-1)+m-1)+m-1,以此类推。%arr.length很好理解了,因为是环形数组,当到了数组末尾时要从头开始,所以取余。
function LastRemaining_Solution(n, m)
{
if(n == 0||m==0)return -1
let arr = []
//用一个数组来模拟环
for(let i=0;i<n;i++){
arr.push(i)
}
let del = 0
while(arr.length!=1){
del = (del+m-1)%arr.length //代码关键
arr.splice(del,1)
}
return arr[0]
}