100个人围成一圈,每个人有一个编码,编号从1开始到100。

他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数

,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?

例如输入M=3时,

输出为:

“58,91” ,

输入M=4时,

输出为:

“34,45,97”。

let arr = []
let M = 3
let num = 0
for(let i = 0;i<100;i++){
    arr.push(i+1)
}
for(let i = 1;i<=arr.length;i++){
    if(i===M){
        num= num + (i-1)
        if(num>=arr.length){
            num = num - arr.length
        }
        arr.splice(num,1)
        i = 1
    }
}
console.log(arr.join(','));

下面是之前写的,在OJ上超时了,大概是80%用例这样。上面是优化后的

let arr = []
let M = 4
for(let i=0;i<100;i++){
    arr.push({
        index:i+1
    })
}
while (arr.length>=M){
    test(M)
}
arr.sort((a,b)=>a.index-b.index)
for(let i of arr){
    console.log(i.index);
}
function test(M){
    for(let i=0;i<arr.length;i++){
        if(i+1===M){
            let beforeArr = arr.splice(0,i+1)
            arr = arr.concat(beforeArr)
            arr.pop()
            break
        }
    }
}