function fn(x,y){
return index;
}
x人围成一个圈,传y次,传到的人离开,最后剩1人,问是第几个。
方法一:数组模拟法
思路:创建一个数组,数组长度是x,每个数组为1,循环一个数组,如果循环到最后一位,就从头开始数,数到y,y为0,最后剩下1的坐标就是结果
function fn(x, y) {
const arr = new Array(x).fill(1);
let index = 0;//坐标
let i = 0;//计算几步
while (true) {
index++
if(arr[index]===1){
i++;
}
if(i===3){
arr[index]=0
i=0;
}
if(index===x){
index=0
}
if (arr.filter(i => i === 1).length === 1) {
break
}
}
return index;
}
方法2:队列模拟法
思路:定义一个队列,把0-x放到队列中,每次把出列一个数,排到末尾,数到y,出列而不进,剩下最后一个数,就是坐标。
function fn(x,y){
let queue = [];
for(let i=0;i<x;i++){
queue[i]=i;
}
let count = 0;
while(queue.length>1){
const item = queue.shift();
count++;
if(count<x){
queue.push(item)
}else{
count=0
}
}
return queue.shift();
}