关于猴子选大王的实现C#版

1.课题来源

         之前在一家公司面试的时候,其中就出了猴子选大王的程序设计题。当时也是第一次遇到这个问题,而且笔试的时间也快到了,改了好几个版本,

         感觉都不太理想。心情烦躁的一笔。现在静下心来,再结合网上的一些介绍。还是慢慢研究了这个问题。并用C#实现代码,同时做下记录

2.问题介绍

       题目如下: 有X只猴子排成一圈,并以其中一只猴子开始顺时针从1开始报数,若报数到Y则将当前猴子剔除队列。然后继续从下一只猴子重新开始从1计数,每次报数等于Y就剔除。如此循环,直到

       剩余最后一只猴子即为选出的大王。

3.问题分析

      这种问题其实是约瑟夫环的数据结构,什么是约瑟夫环?自己百度,我也是自己百度知道的。用一个循环链表数据结构就可以实现。假如有10只猴子。每次数到3就剔除,则步骤如下

   

                                                                                                                                                                                                                                         第九步的时候从10号猴子开始计数1    然后4号猴子2   然后又到10号猴子数3 剔除    最后剩余的4号猴子就是大王

 

 4.代码实现

         C#中并没有循环链表的数据结构,但是可以用链表List也能实现,当数到最后一只猴子时,还从1号猴子继续计数,也能看做循环链表结构,废话不多说,直接上代码

         1.假设有MonkeyNum只猴子,先把这些猴子排列

         

1  List<int> MonkeyQueue = new List<int>();
2             for(int i=1;i<=MonkeyNum;i++)
3             {
4                 MonkeyQueue.Add(i);
5             }
 1 public int GetMonKeyKing(List<int> MonkeyQueue, int Num)
 2         { 
 3             int pos = 1;//开始指向第一只猴子
 4             while(MonkeyQueue.Count>1)//一直循环直到只剩下一只猴子即为大王
 5             {
 6                 for(int i=1;i<=Num;i++)
 7                 {
 8                     if(i==Num)//报数到标记的数
 9                     {
10                         MonkeyQueue.Remove(MonkeyQueue[pos-1]);//先剔除报数的猴子
11                         pos = pos == 1 ? MonkeyQueue.Count : pos - 1;//若报数猴子是第一只则指针指向最后一只,相当于下次从新从第一只计数
12                     }
13                     pos = pos == MonkeyQueue.Count  ? 1 : pos + 1;//不是设定的标志数则一直计数 若到最后一只则还回到第一只计数
14                 } 
15             }
16              return MonkeyQueue[0];//即为大王
17         }

5.结语

      网上其他大神的写法,对于我这逻辑思维能力不行的还不太理解,有知道的还望告知 谢谢

1 public static int SelectKing(int M,int N)
2         {
3             int k = 0;
4             for (int i = 2; i <= M; i++)
5             {
6                 k = (k + N) % i;
7             }
8             return ++k;
9         }

 

posted @ 2020-11-20 16:44  淡泊明志,宁静致远  阅读(549)  评论(0)    收藏  举报