圆圈中最后剩下的数字
2015-04-05 22:34
274 查看
N个人围一圈报数,数到3 退出,最后一个是几号 (1)自定义链表 typedef struct Node { int value; struct Node* next; }Node ,*Link; Link creat(int n){ Link node=new Node; node->value=n-1; Link pre,rear; rear=pre=node; for(int i=n-2;i>=0;i--){ node =new Node; node->value=i; node->next=pre; pre=node; } rear->next=pre; return pre; } int LastRemaining(int m,Link list){ Link p=list,q; int i=0; while(p->next!=p){ i++; if(i==m-1){ q=p->next; p->next=q->next; delete q; i=0; } p=p->next; } int last=p->value; return last; } int _tmain(int argc, _TCHAR* argv[]) { Link list=creat(5); int result=LastRemaining(3,list); printf("%d\n",result); } (2)使用std::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); } 时间O(mn),空间O(n) // ====================方法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; } 时间O(n),空间O(1);
相关文章推荐
- 圆圈中最后剩下的数字
- 《剑指offer》:[45]圆圈中最后剩下的数字(约瑟夫(Josephuse)环问题)
- 程序员面试题精选(14):圆圈中最后剩下的数字
- 剑指offer 6.4 抽象建模能力3 -圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字
- 程序员面试题精选(14)-圆圈中最后剩下的数字
- josephus_求圆圈中最后剩下的数字
- 圆圈中最后剩下的数字(约瑟夫环问题)
- 圆圈中最后剩下的数字
- 程序员面试题精选100题(14)-圆圈中最后剩下的数字
- 剑指offer-面试题45-圆圈中最后剩下的数字
- 《剑指offer》面试题45 圆圈中最后剩下的数字(Java版本)
- 程序员面试题精选100题(14)-圆圈中最后剩下的数字[算法]
- 圆圈中最后剩下的数字
- 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
- 剑指Offer-62:圆圈中最后剩下的数字
- 45 - 圆圈中最后剩下的数字
- 编程算法 - 圆圈中最后剩下的数字(递推公式) 代码(C++)
- 程序员面试题精选100题(14)-圆圈中最后剩下的数字[算法]
- Q45:圆圈中最后剩下的数字