1. 程式人生 > 其它 >JAVA-牛客-約瑟夫問題

JAVA-牛客-約瑟夫問題

技術標籤:JAVA牛客連結串列演算法java

1.題目

題目描述
現有n個人圍坐一圈,順時針給大家編號,第一個人編號為1,然後順時針開始報數。第一輪依次報1,2,1,2…沒報1的人出局。接著第二輪再從上一輪最後一個報數的人開始依次報1,2,3,1,2,3…沒報1的人都出局。以此類推直到剩下以後一個人。現給定一個int n,要求返回最後一個人的編號。

測試樣例:
5
返回:5

2.分析

此問題需要將資料構成環,
因此在這裡採用連結串列儲存每次沒有出局的人
我們首先將1-5號依次放入連結串列,根據題目要求,需要進行1,2報數,且報數為1的不淘汰,那麼通過判斷條件將報數為1的加入
2號連結串列,通過2號連結串列來儲存進入下一輪的人員名單

之後再去判斷2號連結串列即可

程式碼示例

public class Joseph {
    
        
    public int getResult(int n) {
        LinkedList<Integer> ret = new LinkedList();
        for (int i = 1; i <= n; i++) {
            ret.addLast(i);
        }
        int m = 2;
        int tmp = 0;
        int j = 1;
        LinkedList<Integer> ret1 = new LinkedList();
        LinkedList<Integer> ret2 = new LinkedList();
        while (ret.size() != 1) {
            for (; j <= ret.size(); j++) {
                if (j % m == 1) {
                    ret1.addLast(ret.get(j-1));

                }
            }
            tmp = ret1.getLast();
            ret1.removeLast();
            ret1.addFirst(tmp);
            ret2 = (LinkedList<Integer>) ret1.clone();
            ret1.clear();
            ret=ret2;
            m+=1;
            j=1;
        }
        return ret.getFirst();
    }

}

在這裡插入圖片描述