1. 程式人生 > 實用技巧 >[程式設計題] nk:[約瑟夫問題(孩子們的遊戲-圈內最終剩餘的人的編號

[程式設計題] nk:[約瑟夫問題(孩子們的遊戲-圈內最終剩餘的人的編號

[程式設計題] nk:約瑟夫問題(孩子們的遊戲-圈內最終剩餘的人的編號)

輸入輸出

說明:

思路

案例圖解:我們以輸入n=5,m=3為例:

解釋:

一開始自己錯的地方是在如下,while退出條件的地方,錯寫為dummy.next!=head為退出條件,其實我們本質是要檢測圈中剩下一個節點,也就是dummy的next還是dummy我們就退出!

Java程式碼

public class Solution {
    //思路:模擬迴圈連結串列的方法
    public static int LastRemaining_Solution(int n, int m) {
        //極端條件
        if (n <= 0) {
            return -1;
        }
        //步驟1:建立一個由n個同學組成的迴圈連結串列
        Node head = new Node(0);
        Node cur = head;
        for (int i = 1; i < n; i++) {
            cur.next = new Node(i);
            cur = cur.next;
        }
        //把連結串列的首尾相連
        cur.next = head;

        Node dummy = head;
        int k = 0;
        Node pre = new Node(-1);
        pre.next = dummy;
        while (dummy.next!=dummy){  //這裡判斷是否是最後一個節點的中止條件是dummy.next!=dummy,而不是dummy.next!=head;
            if(k++ == m-1){
                pre.next = dummy.next;
                dummy = dummy.next;
                k=0;
            }else{
                pre = dummy;
                dummy = dummy.next;
            }
        }
        return dummy.val;

    }
}

class Node{
    int val;
    Node next;
    public Node(int val){
        this.val = val;
    }
}