【問題】每一年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF做爲牛客的資深元老,天然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。而後,他隨機指定一個數m,讓編號爲0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,而後能夠在禮品箱中任意的挑選禮物,而且再也不回到圈中,從他的下一個小朋友開始,繼續0…m-1報數….這樣下去….直到剩下最後一個小朋友,能夠不用表演,而且拿到牛客名貴的「名偵探柯南」典藏版(名額有限哦!!^_^)。請你試着想下,哪一個小朋友會獲得這份禮品呢?(注:小朋友的編號是從0到n-1)。spa
【思路】這很直接的思路是循環鏈表的方式,原本想要用list容器作的,但最後OJ過不了,因此最後仍是使用vector容器吧,因爲這些小朋友是一個圈的形式,所以當找到第一個小朋友時假設爲temp,則下一個m-1的位置爲temp = (tmp+m-1) % data.size(),注意因爲temp找到時會被刪掉,所以其下一個的位置仍然是temp, 只不過data.size()會減少一個!code
class Solution { public: int LastRemaining_Solution(int n, int m) { if ((m <= 0) && (n <= 0)) return -1; vector<int> data; for (int i = 0; i < n; i++) data.push_back(i); int temp = 0; while (data.size() > 1) { temp = (temp + m-1) % data.size(); data.erase(data.begin()+temp); } return data[0]; } };