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

思路:

  1. 剩余最后一人时游戏停止
  2. 进入游戏, 从0开始把下标往下移, 每移动到下一个下标都要进行提前判断
  3. 数组的当前下标所对应的值不为 null, 就往下报数
  4. 如果报数为3时, 就把数组的当前下标所对应的值删除, 相当于踢出局, 并且报数重新开始, 记录离开的人数
  5. 当下标移动完总人数时, 将下标归 0, 继续循环
// 刚开始的数组
[1, 2, 3, 4, 5, 6]
// 报完数的数组
[1, 2, 空白, 4, 5, 空白]
/**
 * 报数游戏
 * @param { Number } partCount 参与人数
 * @param { Number } callCount 数到几出局
 * @returns 最后一个编号
 */
function gameInit(partCount, callCount) {
  const childArr = []

  for (let i = 1; i <= partCount; i++) {
    // 参与人数
    childArr.push(i)
  }

  let exitCount = 0 // 离开游戏人数
  let current = 0 // 记录当前循环到数组的那一位
  let roll = 0 // 记录当前报到那个数

  // 开始循环, 剩最后一个人结束循环
  while(partCount > exitCount + 1) {
    // 1、开始报数
    if (childArr[current]) {
      roll++
    }

    // 2、报到规定的那个数
    if (roll === callCount) {
      delete childArr[current] // delete: 删除不会影响数组的长度
      exitCount++
      roll = 0
    }

    current++
    // 3、下标刚移到参与人数, 就把他重置, 继续循环
    if (current === partCount) {
      current = 0
    }
  }

  // 循环数组, 把最后的那个数返回
  for (let i = 0; i <= partCount; i++) {
    if (childArr[i]) {
      return childArr[i]
    }
  }
}

console.log(gameInit(30, 3)) // 29
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值