您的位置:首页 > Web前端

剑指Offer——圆圈中最后剩下的数字

2016-05-20 17:09 405 查看
//剑指Offer——圆圈中最后剩下的数字
//0,1,2,。。n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈中删除第m个数字。
//求剩下的最后一个数字。
#include <iostream>
#include <list>
#include <stdio.h>
using namespace std;

//解法一:环链表,利用模板库中的std:list来模拟环链表
//每当迭代器(Iterator)扫描到链表末尾时,将迭代器移到链表头部。
int LastNumInCircle(unsigned int n,unsigned int m)
{
if(n<1||m<1)
return -1;
unsigned int i=0;

list<int> number;//建立整型的链表
for(i=0;i<n;++i)
number.push_back(i);//n个数进入链表

list<int>::iterator current=number.begin();//链表的首元素

while(number.size()>1)
{
for(int i=1;i<m;++i)
{
current++;
//如果扫描迭代器的尾部,则指向迭代器头部
if(current==number.end())
current=number.begin();
}

//保存下一结点
list<int>::iterator next=++current;
if(next==number.end())
next=number.begin();

--current;
number.erase(current);
//开始下一轮的遍历
current=next;
}
return *(current);//通过解引用begin返回的迭代器来获得首元素的引用
}

int LastNumInCircle2(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;
}


void Test(unsigned int n,unsigned int m,int expected)
{
printf("Test begins.\n");
if(LastNumInCircle(n,m)==expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n");
if(LastNumInCircle2(n,m)==expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n");
printf("\n");
}
void test1()
{
Test(5,3,3);
}
void test2()
{
Test(6,7,4);
}
void test3()
{
Test(0,0,-1);
}
int main()
{
test1();
test2();
test3();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: