猴子选大王的c#实现

时间:2022-06-08 23:26:34

  原文地址:猴子选大王的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 = ; i <= monkeyNum; i++) monkeys.Add(i); int position = ;
while (true)
{
for (int i = ; i <= loopLength; i++)
{
if (i == loopLength)
{
monkeys.Remove(monkeys[position]);
position = position == ? position = monkeys.Count - : position - ;
}
position = position == monkeys.Count - ? : position + ;
} if (monkeys.Count == ) return monkeys[];
}
}

  OK, 这个方法的返回值就是中奖当王的那只了。