1823.找出游戏的胜利者

/**
 * @param {number} n
 * @param {number} k
 * @return {number}
 */
var findTheWinner = function (n, k) {
    // 构造游戏参与者
    let nums = []
    for (let i = 1; i <= n; i++) {
        nums.push(i)
    }

    let hit = 0 // 游戏每轮传递给谁

    // 当游戏人数为1个时,该成员就是胜利者
    while (nums.length > 1) {
        // 开始绕圈,每轮传递k步,自身算一步,所以i从1开始
        for (let i = 1; i < k; i++) {
            hit++
            // 超过了就又从0开始传递
            if (hit > nums.length - 1) {
                hit = 0
            }
        }
        // console.log(hit, nums[hit])
        // 传到谁就把谁删掉
        nums.splice(hit, 1)
        // console.log(nums)

        // 删掉后,新一轮从下一个人开始传递,前面的人删掉了,所以hit不用变
        // 但是如果删的是最后一个元素,下一回合就是从0开始了
        if (hit > nums.length - 1) {
            hit = 0
        }
    }

    // console.log(nums)

    return nums[0]
};

/**
 * @param {number} n
 * @param {number} k
 * @return {number}
 */
var findTheWinner = function (n, k) {
    // 模拟队列,很巧妙
    // 因为一直绕圈传递,其实就是个环,就是不断从队列头取出元素放入队尾的过程

    let queue = []
    // 构造游戏参与者
    for (let i = 1; i <= n; i++) {
        queue.push(i)
    }

    // 每轮淘汰一人,剩下的最后一人就是胜利者
    while (queue.length > 1) {
        // 传递k步
        for (let i = 0; i < k; i++) {
            // 从队列头取出放入队尾,形成环
            queue.push(queue.shift())
        }
        // 淘汰一人
        queue.pop()
    }

    return queue[0]
}

console.log(findTheWinner(5, 2))
// console.log(findTheWinner(3, 5))