前端面试手写代码——小孩报数问题

题目:小孩报数问题
有30个小孩儿,编号从1-30,围成一圈依此报数,1、2、3 数到 3 的小孩儿退出这个圈, 然后下一个小孩 重新报数 1、2、3,问最后剩下的那个小孩儿的编号是多少?

// 有30个小孩儿,编号从1-30,围成一圈依此报数,1、2、3 数到 3 的小孩儿退出这个圈, 然后下一个小孩 重新报数 1、2、3,问最后剩下的那个小孩儿的编号是多少?
const fn = (num, cycle) => {
  // 给每个小孩编号码
  const childArr = [];
  for (let i = 1; i <= num; i++) {
    childArr.push(i);
  }

  let exitNum = 0; // 退出圈的小孩数
  let curCount = 1; // 当前报数
  let curIndex = 0; // 当前的下标

  // 以下假设报数报到 3, 即 cycle = 3
  while (num - exitNum > 1) {
    if (childArr[curIndex] !== 0) {
      // 报数到 3
      if (curCount === cycle) {
        childArr[curIndex] = 0; // 数到 3 的设置为了 0 作为离圈标识
        curCount = 1; // 重置报数
        exitNum++; // 记录退出人数,作为判断退出条件判断
      } else {
        // 报数未到 3,报数继续
        curCount++;
      }
    }
    curIndex++; // 进入下一个同学判断
    // 成圆
    if (curIndex === num) {
      curIndex = 0;
    }
  }

  return childArr.find((item) => item !== 0);
};

fn(30, 3); // 29

你可能感兴趣的:(JavaScript,前端,javascript)