关于猴子选大王的实现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 }

浙公网安备 33010602011771号