《劍指offer》-孩子們的遊戲(圓圈中最後剩下的數)

題目描述

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);
    }
};


發佈了110 篇原創文章 · 獲贊 128 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章