约瑟夫环: n个数字排成一个圆圈,从数字0开始,每次从这个圆圈中删除第k个数字,求这个圆圈中最后剩下的数字。
我们可以使用标准库中的链表来模拟一个圆环,每次访问到链表的结尾时,重新从头开始访问,直到链表中只剩下最后一个元素,输出结果。
int lastRemaining(unsigned int n,unsigned int k){
if (n < 1 || k < 1){
return -1;
}
list<int> numbers;
for (int i = 0; i < n;++i)
{
numbers.push_back(i);
}
list<int> ::iterator current = numbers.begin();
while (numbers.size()>1)
{
for (int i = 1; i < k;++i)
{
++current;
if (current==numbers.end())
{
current = numbers.begin();
}
}
list<int>::iterator i_next = ++current;
if (i_next==numbers.end())
{
i_next = numbers.begin();
}
--current;
numbers.erase(current);
current = i_next;
}
return *current;
}
更简便的一种实现:
int lastRemaining(unsigned int n,int k){
if(n<1||k<1){
return -1;
}
int result=0;
for(int i=2;i<=n;++i){
result=(result+k)%i;
}
return result;
}