1.正向操作,报数为m的删掉,最后只留一个
function rev(n, m) {
let arr = []
for (let i = 1; i <= n; i++) {
arr.push(i)
}//1-n存入数组
let t = 1, i = 0
while (arr.length > 1) {
if (t == m) {//报数m,在数组中去掉这个数,t从1开始数,注意i不用+1,因为splice删除次数,后面自动向前填补,i自动为下一个数
arr.splice(i, 1)
t = 1
} else {
t++
i++
}
if (i == arr.length - 1&&arr.length > 1) {//i走到数组最后
if (t == m) {//如果报数m,删数(注意这一步不可忽略,否则出错)
arr.splice(i, 1)
t = 1
}else {未报数m,继续报数
t++
}
i = 0 //i走到数组最后,重新置1
}
}
return arr[0]//返回唯一剩下的数
}
console.log((rev(13, 5)))
2.逆向操作,从最后剩的人最开始找其下标
var lastRemaining = function(n, m) {
res=0
for(let i =2;i<=n;i++){
res=(res+m)%i
}
return res
};