約瑟夫問題I

約瑟夫問題是一個非常著名的趣題,即由n個人坐成一圈,按順時針由1開始給他們編號。然後由第一個人開始報數,數到m的人出局。現在需要求的是最後一個出局的人的編號。

給定兩個int nm,代表遊戲的人數。請返回最後一個出局的人的編號。保證n和m小於等於1000。

測試樣例:

5 3
返回:4

 

有一種數學思想的方法,較爲複雜。

 

這裏用比較好理解的方法,藉助容器來實現。

可以用vector來設置標記位,標記該序號的人是否已經出隊了。

 

因爲涉及到不停的在數組中刪除,這裏用list實現。

 

 

class Joseph {
public:
    int getResult(int n, int m) {
        // write code here
        list<int> ary;
        for(int i = 1; i <= n; ++i)
        {
            ary.push_back(i);
        }
        int cnt = 0;
        while(ary.size() > 1)
        {
            for(auto it = ary.begin(); it != ary.end(); )
            {
                cnt++;
                if(cnt == m)
                {
                    cnt = 0;
                    it = ary.erase(it);
                }
                else
                    ++it;
            }
        }
        return ary.back();
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章