百度外包面试官:这道击鼓传花写一下

284 阅读1分钟
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();
}

参考