【剑指offer】孩子们的游戏(圆圈中最后剩下的数)

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

http://www.nowcoder.com/questionTerminal/f78a359491e64a50bce2d89cff857eb6

【建议看书上题解】
一种方法是用环形链表模拟圆圈的经典解法;

class ListNode {

    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

public class Solution {

    public int LastRemaining_Solution(int n, int m) {

        if (n <= 0 || m <= 0) {
            return -1;
        }

        ListNode head = new ListNode(0);
        ListNode node = head;
        for (int i = 1; i < n; i++) {
            node.next = new ListNode(i);
            node = node.next;
        }
        node.next = head;

        int k = 0;
        while (node.next != node) {
            if (++k == m) {
                node.next = node.next.next;
                k = 0;
            } else {
                node = node.next;
            }
        }

        return node.val;
    }

}

第二种是分析每次被删除数字的规律并直接计算圆圈中最后剩下的数字。

public class Solution {

    public int LastRemaining_Solution(int n, int m) {

        if (n <= 0 || m <= 0) {
            return -1;
        }

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

    }
}
全部评论
第二个算法中,11行,n应该为i
2 回复
分享
发布于 2020-03-03 15:54
牛逼呀,环形链表
点赞 回复
分享
发布于 2020-04-05 20:18
联易融
校招火热招聘中
官网直投
第一种29行为什么是=m的时候删除下一个呢
点赞 回复
分享
发布于 2020-05-08 22:11
while (node.next != node) { if (++k == m) { node.next = node.next.next; k = 0; } else { node = node.next; } } 我的理解是,++k帮下一个人叫号,下一个人符合条件就踢下一个人出去,但是这样的话条件应该是m-1,为什么是m呢?
点赞 回复
分享
发布于 2020-09-11 16:27

相关推荐

19 3 评论
分享
牛客网
牛客企业服务