約瑟夫問題是一個非常著名的趣題,即由n個人坐成一圈,按順時針由1開始給他們編號。然後由第一個人開始報數,數到m的人出局。現在需要求的是最後一個出局的人的編號。
給定兩個int n和m,代表遊戲的人數。請返回最後一個出局的人的編號。保證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();
}
};