题目描述
0,1,…,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
题目分析
剑指Offer(纪念版)P229
约瑟夫(Josephuse)环问题
我们使用模板库中的双向链表std:list来模拟一个环形链表。
PS:向量vector 线性顺序结构,相当于数组
双向链表list 线性链表结构
代码实现
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); 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(); } list<int>::iterator next = ++ current; if(next == numbers.end()) next = numbers.begin(); -- current; numbers.erase(current); current = next; } return *(current); }