原文地址:猴子选大王的c#实现作者:余文
今天被问到了猴子选大王的意思,题目大意就是说有n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
这个问题明显改用循环链表来做,方便快捷。不过可惜C#里没有循环链表,只有双向链表。当然可以通过继承双向链表来重写节点的next方法,让最后一个节点指向第一个节点,实现自定义的循环链表。不过那样麻烦些,况且,没有循环链表,就干不了活了吗?用普通list一样做。就当猴子没有围城一圈,从1号猴子开始站成一排,数到最后就接着从队列开头继续数好了。具体实现如下。
public static int GetKing(int monkeyNum, int loopLength) { List<int> monkeys = new List<int>(); for (int i = 1; i <= monkeyNum; i++) monkeys.Add(i); int position = 0; while (true) { for (int i = 1; i <= loopLength; i++) { if (i == loopLength) { monkeys.Remove(monkeys[position]); position = position == 0 ? position = monkeys.Count - 1 : position - 1; } position = position == monkeys.Count - 1 ? 0 : position + 1; } if (monkeys.Count == 1) return monkeys[0]; } }
OK, 这个方法的返回值就是中奖当王的那只了。