0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
经典约瑟夫环问题,可以参考这个博主的文章讲解。
笔者花了点时间做了个ppt动画,帮组大家理解。原PPT
class Program
{
static void Main(string[] args)
{
Console.WriteLine(LastRemaining2(5, 3));
Console.Read();
}
public static int LastRemaining2(int n,int m)
{
if (n == 1)
{
return 0;
}
return (LastRemaining2(n - 1, m) + m) % n;
}
}
笨方法,一直找就完事了
class Program
{
static void Main(string[] args)
{
Console.WriteLine(LastRemaining2(5, 3));
Console.Read();
}
public static int LastRemaining2(int n,int m)
{
List<int> lists = new List<int>();
for (int i = 0; i < n; i++)
{
lists.Add(i);
}
//取余就是除去第几个
int times = n - 1;
int res = 1;
for (int i = 0; i < times; i++)
{
//取余
res = (m + res - 1) % n;
//余数 = 0,移除最后一项
if (res == 0)
{
lists.Remove(lists.Last());
//意味着移去了最后一个 所以res=1
res = 1;
}
//不为0,移除该索引项
else
lists.RemoveAt(res - 1); //移除指定值
n--;
}
return lists[0];
}
}