题目:
圆圈中最后剩下的数
题目:0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
思路:用约瑟夫环的思想
例如,0、1、2、3、4这5个数字组成一个圆圈(如图6.3所示),从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
可以用模板库中的std:list来模拟一个环形链表。由于std::list本身并不是一个环形结构,因此每当迭代器(Iterator)扫描到链表末尾的时候,我们要记得把迭代器移到链表的头部。
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if (n < 1 || m < 1)
return -1;
list<int> mlist;
for (int i = 0; i < n; i++)
mlist.push_back(i);
long count = 0;
auto it = mlist.begin();
int k = m - 1;
while (mlist.size() > 1) {
while (k--) {
it++;
if (it == mlist.end())
it = mlist.begin();
}
it = mlist.erase(it);
if (it == mlist.end())
it = mlist.begin();
k = m - 1;
}
return mlist.front();
}
};