给出一个数字代码队伍中人数,从第一个人开始报数,报到5就是幸运人,这个人出队,从下一个人开始继续从1开始报数。 请问队伍最后一个人是幸运人的时候是第几个出队的。
function method(n, log = false) {
let state = Array(n).fill('0');
let count = 0;
let i = 0;
while (n > 0) {
log && console.log('========================');
log && console.log(`目前: ${state.join('')}`);
const deleteNum = Math.ceil((n - i) / 5);
for (let j = i + 5; j <= n; j += 5) state[j - 1] = 'x';
log && console.log(`退出${deleteNum}人`);
const tmpI = i + 5 * deleteNum;
log && console.log(`tmpI停留在${tmpI}`);
i = tmpI % n === 0 ? n - 1 : tmpI % n - 1;
state[i] = 'i';
log && console.log(`i实际停留在${i}: ${state.join('')}`);
count += deleteNum;
if (i === n - 1) return count;
n -= deleteNum;
state = state.filter(item => item !== 'x');
state.splice(i, 1);
log && console.log(`目前一共退出${count}人: ${state.join('')}`);
log && console.log(`还剩${n}人`);
}
}
const input = 7;
console.log(method(input, true));
输出为:
========================
目前: 0000000
退出2人
tmpI停留在10
i实际停留在2: 00i0x00
目前一共退出2人: 00000
还剩5人
========================
目前: 00000
退出1人
tmpI停留在7
i实际停留在1: 0i000
目前一共退出3人: 0000
还剩4人
========================
目前: 0000
退出1人
tmpI停留在6
i实际停留在1: 0i00
目前一共退出4人: 000
还剩3人
========================
目前: 000
退出1人
tmpI停留在6
i实际停留在2: 00i
5