剑指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; }
相关文章推荐
- <Js>数据类型
- CSS——display显示属性
- js抛物线
- Web前端程序员推荐7个实用的JavaScript工具
- js判断单选按钮是否被选中
- HTML5新标签在IE6/IE7/IE8中的几种兼容方式
- NW.js & Electron Compared (2016 Edition)
- 详解JavaScript中的事件流和事件处理程序
- bootstrap模态框配置
- CSS自适应布局总结
- json一些特点
- QPushButton 的样式表代码
- struts2+jquery+json集成
- js跨域请求
- 50个必备的实用jQuery代码段
- 一句命令快速合并 JS、CSS
- js简单分页,可用
- jQuery自动补全小数
- CAFFE-调试技巧
- jQuery基础的工厂函数以及定时器的经典实例分析