剑指offer 45-约瑟夫环

来源:互联网 发布:淘宝加盟诈骗罪 编辑:程序博客网 时间:2024/05/29 18:24

方法1:list 循环

方法2: 公式法

方法3:链表

#include<iostream>#include<list>using namespace std;//方法1int LastRemaining(unsigned int n,int m){if(n<1 || m<-1)return 0;list<int> numbers;for(int i=0;i<n;i++)numbers.push_back(i);list<int>::iterator iter = numbers.begin();while(numbers.size()>1){for(int i=1;i<m;i++){++iter;if(iter==numbers.end())iter=numbers.begin();}list<int>::iterator  next = ++iter;if(next==numbers.end())next=numbers.begin();numbers.erase(--iter);iter = next;}return *iter;}//方法2int LastRemaining2(unsigned int n,int m){if(n<1 || m<-1)return 0;int result = 0;for(int i=2;i<=n;i++)result = (result+m)%i;return result;}// ====================测试代码====================void Test(char* testName, unsigned int n, unsigned int m, int expected){    if(testName != NULL)        printf("%s begins: \n", testName);    if(LastRemaining(n, m) == expected)        printf("Solution1 passed.\n");    else        printf("Solution1 failed.\n");    if(LastRemaining2(n, m) == expected)        printf("Solution2 passed.\n");    else        printf("Solution2 failed.\n");    printf("\n");}void Test1(){    Test("Test1", 5, 3, 3);}void Test2(){    Test("Test2", 5, 2, 2);}void Test3(){    Test("Test3", 6, 7, 4);}void Test4(){    Test("Test4", 6, 6, 3);}void Test5(){    Test("Test5", 0, 0, -1);}void Test6(){    Test("Test6", 4000, 997, 1027);}int main(int argc, char* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    return 0;}


#include<iostream>using namespace std;struct ListNode{         int data;         ListNode *next;}; void Josephus(int n,int k,intm){         if(n<k || n<m)                   return;         ListNode *head=new ListNode();         head->data=1;         head->next=NULL;         ListNode *p=head;         for(int i=2;i<=n;i++)         {                   ListNode *node=new ListNode();                   node->data=i;                   p->next=node;                   p=p->next;         }         p->next=head;         p=head;      ListNode *r=p;         while(k--)         {                   r=p;                   p=p->next;         }                while(n--)         {                   for(int s=m-1;s--;r=p,p=p->next);                   r->next=p->next;        cout<<p->data<<"  ";                   delete p;                   p=r->next;         }}int main(){         Josephus(13,4,2);}




0 0