您的位置:首页 > Web前端

剑指offer-44 圆圈中最后剩下的数字

2015-04-27 15:08 225 查看
#include <iostream>
#include <list>
using namespace std;

/*
转化成约瑟夫环问题求解
*/
int LastRemaining_2(unsigned int n,unsigned int m);
int LastRemaining(unsigned int n,unsigned int m);
int LastRemaining(unsigned int n,unsigned int m)
{
if(n<1 || m<1)
return -1;
//构建链表
list<int> numbers;
for(unsigned 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<m;i++)
{
current++;
if(current==numbers.end())
current=numbers.begin();
}
//删除第m个元素
list<int>::iterator next = ++current;
if(next==numbers.end())
next = numbers.begin();

numbers.erase(--current);
current = next;
}
return *current;
}

/*
第二种方法,推导过程很麻烦
*/
int LastRemaining_2(unsigned int n,unsigned int m)
{
if(n<1 || m<1)
return -1;
int last = 0;
for(int i = 2;i<=n;i++)
last = (last+m) % i;
return last;
}
int main()
{
cout<<LastRemaining(5,3)<<endl;
cout<<LastRemaining_2(5,3);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: