标签:面试题 取出 ems too aop sheng nta button tools
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
限制:
1 <= n <= 10^5
1 <= m <= 10^6
思路:看到约瑟夫环首先想到的是用单链表做成的环,然后不断地转圈取元素,但是这道题有限制,一般链表会超时,所以学习了另一种数学方法。
以n=5,m=3为例:
0,1,2,3,4,
第一次取出元素后,它变成了0,1,#,3,4,
可以将右面的的元素提前,变为3,4,0,1
再次取出元素,变为3,4,#,1
提前元素,变为1,3,4
再次取出元素,变为1,3,#
提前元素,变为1,3
最后一次,只剩下一个人3
我们可以这样理解,就是倒着推
1个人:0的位置
2个人:从0的位置向后移动m位,到了1的位置(0->1->0->1)
3个人:从1的位置向后移动m位,到了1的位置(1->2->0->1)
4个人:从1的位置向后移动m位,到了0的位置(1->2->3->0)
5个人:从0的位置向后移动m位,到了3的位置(0->1->2->3)
所以应该是n的答案是从n-1向右移动m个位置
数组到达最后就依靠%返回到头部
int lastRemaining(int n, int m){ if(n==1){ return 0; } return (lastRemaining((n-1),m)+m)%n; }
标签:面试题 取出 ems too aop sheng nta button tools
原文地址:https://www.cnblogs.com/woju/p/12600001.html