面试题45:圆圈中最后剩下的数字
2017-09-21 17:15
232 查看
学习了一段时间《剑指offer》现在做了一些笔试,现在陆续把笔记上传到博客,方便自己及他人上网查看。
题目:0,1,2,3……n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
思路:本题是约瑟夫环的问题。有两种解法:1 用环形链表模拟圆圈 2 分析每次被删除的数字规律并直接计算出圆圈中最后剩下的数字。
解法一:创建共有n个节点的环形链表(这里我们可以创建一个环形链表也可以用std::list来模拟一个环形链表)由于list本事并不是一个环形结构,因此没法挡迭代器扫描到链表末尾的时候,要把迭代器一道链表的头部,代码如下:
创新的解法:定义一个关于n和m的方程,表示n个数字中每次删除第m个数字最后剩下的数字。
题目:0,1,2,3……n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
思路:本题是约瑟夫环的问题。有两种解法:1 用环形链表模拟圆圈 2 分析每次被删除的数字规律并直接计算出圆圈中最后剩下的数字。
解法一:创建共有n个节点的环形链表(这里我们可以创建一个环形链表也可以用std::list来模拟一个环形链表)由于list本事并不是一个环形结构,因此没法挡迭代器扫描到链表末尾的时候,要把迭代器一道链表的头部,代码如下:
#include<iostream> #include<list> using namespace std; int Lastnumber(int n, int m) { if (n < 1 || m < 1) return -1; int i = 0; list<int> numbers; for (i = 0; i < n; ++i) numbers.push_back(i); list<int>::iterator current = numbers.begin(); while (numbers.size()>1) { //从0数到m for (i = 0; i < m; i++) { 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); }
创新的解法:定义一个关于n和m的方程,表示n个数字中每次删除第m个数字最后剩下的数字。
int LastNumber(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; }
相关文章推荐
- 面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 面试题45-------圆圈中最后剩下的数字(数字)
- 【剑指offer】6.4抽象建模能力——面试题45:圆圈中最后剩下的数字
- 剑指offer 面试题45—圆圈中最后剩下的数字(约瑟夫环)
- 面试题45—圆圈中最后剩下的数字
- 剑指Offer:面试题45 圆圈中最后剩下的数字
- 剑指Offer面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字(约瑟夫环问题)
- 剑指Offer面试题45圆圈中最后剩下的数字(约瑟夫环问题),面试题46求1+2+...+n
- 剑指offer-面试题45-圆圈中最后剩下的数字
- 《剑指Offer》学习笔记--面试题45:圆圈中最后剩下的数字
- 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
- (剑指Offer)面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 【剑指Offer】面试题45:圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 剑指offer 面试题45 圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 剑指Offer系列-面试题45:圆圈中最后剩下的数字