JZ46-孩子们的游戏(约瑟夫环,圆圈中最后剩下的数)

孩子们的游戏(圆圈中最后剩下的数)

https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

class Solution {
    public int LastRemaining_Solution(int n, int m) {
        if (n < 1 || m < 1) {
            return -1;
        }
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        int cur = -1;
        while (list.size() > 1) {
            for (int i = 0; i < m; i++) {
                cur++;
                if (cur == list.size()) { //转够一圈
                    cur = 0;
                }
            }
            list.remove(cur);
            cur--; //cur--的原因,因为新的list中cur指向了下一个元素,为了保证移动m个准确性,所以cur向前移动一位。
        }
        return list.get(0);
    }
}

class Solution2 {
    public int LastRemaining_Solution(int n, int m) {
        if (n < 1 || m < 1) {
            return -1;
        }
        ListNode head = new ListNode(0); //第一个孩子
        ListNode temp = head;
        for (int i = 1; i < n; i++) {
            temp.next = new ListNode(i);
            temp = temp.next;
        }

        temp.next = head; //形成一个环

        int k = 0;
        while (temp.next != temp) {
            if (++k == m) {
                temp.next = temp.next.next; //删去抽中的孩子
                k = 0;
            } else {
                temp = temp.next;
            }
        }
        return temp.val;
    }
}

    /**
     * f[1] = 0
     * f[2] = (f{1] + m) % 2
     * f[3] = (f[2] + m) % 3
     * ...
     * f[n] = (f[n-1] + m) % n
     */
class Solution3 {
    public int LastRemaining_Solution(int n, int m) {
        if (n < 1 || m < 1) {
            return -1;
        }

        int ans = 0;
        for (int i = 2; i <= n; i++) {
            ans = (ans + m) % n;
        }
        return ans;
    }
}

全部评论

相关推荐

迷茫的大四🐶:当你得到一些东西,那这些东西就会变成基本项,你有别人也有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务