題目描述
0,1,2.....n-1這n個數字排成一個圈,從數字0開始每次從圓圈裏刪除第m個數(從1開始計數)。求出這個圓圈最後剩下的數字。
解法:
1.構建一個鏈表用來存儲這些數字,很明顯可以用STL裏面的容器list進行存儲
2.而後進行刪除,當list裏面的數字個數大於1的時候,循環進行刪除
3.在循環體裏,先找到第m個數的位置(注意for從1開始,取不到m,可以自己試幾個數就知道了),在for循環時,如果當前迭代器到達尾部,那麼就讓他指向頭部
4.保存當前迭代器的下一個迭代器的值,這裏需要刪除後給當前迭代器賦值。同理需要判斷next是不是指到尾部,若到尾部就進行轉移到頭部
5.刪除當前迭代器,將後一個迭代器進行賦值給當前,進行下一輪循環
class Solution {
public:
int LastRemaining_Solution(unsigned int n, unsigned int m) {
if(n < 1 || m < 1) return -1;
list<int> number;
unsigned int i;
for(i = 0; i < n; i++) {
number.push_back(i);
}
list<int>::iterator current = number.begin();
list<int>::iterator next;
while(number.size() > 1) {
for(int i = 1; i < m; i++) {
current++;
if(current == number.end()) {
current = number.begin();
}
}
next = ++current;
if(next == number.end()) {
next = number.begin();
}
--current;
number.erase(current);
current = next;
}
return *(current);
}
};