題目描述:
每年六一兒童節(jié),??投紩?zhǔn)備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為??偷馁Y深元老,自然也準(zhǔn)備了一些小游戲。其中,有個(gè)游戲是這樣的:首先,讓小朋友們圍成一個(gè)大圈。然后,他隨機(jī)指定一個(gè)數(shù)m,讓編號為0的小朋友開始報(bào)數(shù)。每次喊到m-1的那個(gè)小朋友要出列唱首歌,然后可以在禮品箱中任意的挑選禮物,并且不再回到圈中,從他的下一個(gè)小朋友開始,繼續(xù)0...m-1報(bào)數(shù)....這樣下去....直到剩下最后一個(gè)小朋友,可以不用表演,并且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!_)。請你試著想下,哪個(gè)小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
如果沒有小朋友,請返回-1
示例:
輸入:5,3
返回: 1
思路:
這是典型的約瑟夫環(huán)問題。使用一個(gè)單向環(huán)形鏈表模擬。
code:
import java.util.*;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<1||m<1){
return -1;
}
List<Integer> list = new ArrayList<>();
//構(gòu)建list
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--的原因,因?yàn)樾碌膌ist中cur指向了下一個(gè)元素,為了保證移動(dòng)m個(gè)準(zhǔn)確性,所以cur向前移動(dòng)一位。
}
return list.get(0);
}
}