JAVA-牛客-約瑟夫問題
阿新 • • 發佈:2021-01-25
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號連結串列來儲存進入下一輪的人員名單
程式碼示例
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(); } }