面试题45:圆圈中的数字
来源:互联网 发布:淘宝主图大小尺寸像素 编辑:程序博客网 时间:2024/06/05 17:39
1.题目:0,1,2.....,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈中删除掉第m个数字,求出这个圆圈里剩下的最后一个数字。
分析
例如,0,1,2,3,4这5个数字组成的一个圆圈,从数字0开始每次删除第三个数字,则删除的前四个数字依次是2,0,4,1,最后剩下的数字是3. 其实就是著名的Josephuse环问题。
解法一:
采用类似环形链表的方法来模型这个圆圈,可以使用模板库中的list来模拟环形链表,当每次迭代器到链表末尾的时候,把迭代器移到链表的头部,这样就相当于是环形遍历了。这种方法的时间复杂度是O(mn),空间复杂度是O(n)。
解法二:
可以定义一个关于n和m的方程,表示每次在n个数字0,...,n-1中每次删除第m个数字最后剩下的数字。
在第n个数字中,第一个被删除的数字是(m-1)/n,可以记为k,那么删除k之后剩下的n-1个数字为0,1,..k-1,k+1,...n-1,并且下一次删除的数字从k+1开始计数,相当于k+1排在前面,形成排列K+1,...n-1,0,1,...k-1。剩下的数字也是关于m和n的函数,可以记为f‘(n-1,m),最初的序列最后剩下的数字一定是删除一个数字之后剩下的数字,即f(n,m)=f'(n-1,m).可以将新序列做出如下的映射。
源码:
/*** 功能说明:Description* 作者:K0713* 日期:2016-10-9**/#include<iostream>#include <list>using namespace std;// ====================方法1====================int LastRemaining_Solution1(unsigned int n, unsigned int m){if (n < 1 || m < 1)return -1;unsigned int i = 0;list<int> numbers;for (i = 0; i < n; ++i)numbers.push_back(i);//构建listlist<int>::iterator current = numbers.begin();while (numbers.size() > 1){for (int i = 1; i < m; ++i)//找到第m个数{current++;if (current == numbers.end())//模拟环形current = numbers.begin();}list<int>::iterator next = ++current;//保留指针if (next == numbers.end())next = numbers.begin();--current;numbers.erase(current);//释放当前第m个位置的元素current = next;}return *(current);}// ====================方法2====================int LastRemaining_Solution2(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 << "---------方法1---------" << endl;int result1 = LastRemaining_Solution1(5, 3);cout << "result: " << result1 << endl;cout << "---------方法2---------" << endl;int result2 = LastRemaining_Solution2(5, 3);cout << "result: " << result2 << endl;system("PAUSE");return 0;}
0 0
- 面试题45:圆圈中的数字
- 面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 剑指offer-面试题45:圆圈中最后的数字
- 面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 面试题45—圆圈中最后剩下的数字
- 面试题 45: 圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 剑指offer面试题45圆圈中最后一个数字,约瑟夫环模拟和数学解法
- 剑指Offer:面试题45 圆圈中最后剩下的数字
- 剑指offer 面试题45—圆圈中最后剩下的数字(约瑟夫环)
- 《剑指Offer》学习笔记--面试题45:圆圈中最后剩下的数字
- 【剑指Offer学习】【面试题45:圆圈中最后剩下的数字(约瑟夫环问题)】
- 剑指Offer面试题45(Java版):圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字(约瑟夫环问题)
- 剑指offer之面试题45圆圈中最后剩下的数字
- poj 2891 Strange Way to Express Integers
- web前端-CSS 尺寸 (Dimension)-016
- BZOJ3998: [TJOI2015]弦论 解题报告
- libevent入门教程
- iOS巅峰之GitHub设置和xCode代码上传的详解步骤
- 面试题45:圆圈中的数字
- mysql 查询所权限
- Android Studio 定制注视模版
- git的一些简单使用
- 不定期更新的一些Java小的知识点
- 方法传值
- 建立学生信息链表
- Machining
- 安装配置远程jupyter notebook(原ipython notebook)