剑指Offer45 约瑟夫环

  1 /*************************************************************************
  2     > File Name: 45_LastNumberInCircle.cpp
  3     > Author: Juntaran
  4     > Mail: JuntaranMail@gmail.com
  5     > Created Time: 2016年09月04日 星期日 20时21分57秒
  6  ************************************************************************/
  7  
  8 #include <stdio.h>
  9 #include <bits/stdc++.h>
 10 
 11 using namespace std;
 12 
 13 
 14 // 环形链表
 15 int LastRemaining1(int n, int m)
 16 {
 17     if (n<1 || m<1)
 18         return -1;
 19     
 20     int i = 0;
 21     
 22     list<int> numbers;
 23     for (int i = 0; i < n; ++i)
 24         numbers.push_back(i);
 25     
 26     list<int>::iterator current = numbers.begin();
 27     while (numbers.size() > 1)
 28     {
 29         for (int i = 1; i < m; ++i)
 30         {
 31             current ++;
 32             if (current == numbers.end())
 33                 current = numbers.begin();
 34         }
 35         list<int>::iterator next = ++current;
 36         if (next == numbers.end())
 37             next = numbers.begin();
 38         
 39         --current;
 40         numbers.erase(current);
 41         current = next;
 42     }
 43     return *current;
 44 }
 45 
 46 // 数组模拟环
 47 int LastRemaining2(int n, int m)
 48 {
 49     if (n<1 || m<1)
 50         return -1;
 51     
 52     int array[n];
 53     int i = -1;
 54     int step = 0;
 55     int count = n;
 56     
 57     while (count > 0)
 58     {
 59         i ++;
 60         if (i >= n)            // 模拟环
 61             i = 0;
 62         if (array[i] == -1)
 63             continue;
 64         step ++;
 65         if (step == m)
 66         {
 67             array[i] = -1;
 68             step = 0;
 69             count --;
 70         }
 71     }
 72     int ret = i;
 73     return ret;
 74 }
 75 
 76 // 数学解法
 77 int LastRemaining3(int n, int m)
 78 {
 79     if (n<1 || m<1)
 80         return -1;
 81     
 82     int ret = 0;
 83     for (int i = 2; i <= n; ++i)
 84         ret = (ret + m) % i;
 85     
 86     return ret;
 87 }
 88 
 89 int main()
 90 {
 91     int n = 100;
 92     int m = 5;
 93     
 94     int ret1 = LastRemaining1(n, m);
 95     int ret2 = LastRemaining2(n, m);
 96     int ret3 = LastRemaining3(n, m);
 97     
 98     printf("ret1 is %d\n", ret1);
 99     printf("ret2 is %d\n", ret2);
100     printf("ret3 is %d\n", ret3);
101     
102     return 0;
103 }

 

转载于:https://www.cnblogs.com/Juntaran/p/5840433.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值