0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
算法解释约瑟夫环
如一个数组是
[0,1,2,3,4]然后进行约瑟夫环数学计算
第一轮:
[0,1,2,3,4]删除的是第3个数字:2,数组就变成[0,1,3,4],第二轮就从新数组里面的数字3开始计算
第二轮:
[0,1,3,4]删除的第3个数字是0,数组就变成了[1,3,4],第三轮就从新数组里面的数字1开始计算后三个数
第三轮:
[1,3,4]删除的第三个数字是4,数组会变成[1,3],第四轮就从新数组里面的数字1开始计算后三个数
第四轮:
[1,3]删除的第3个数字是1,数组只剩下3,因此最后剩下的数字就是3,此时的数组里面的3,下标是0
那么我们现在就开始反推:
最后剩下的数字它的最新坐标肯定是0;
第四轮的反推:
补上3个位置,然后模上当时的数组大小2,(0+3)%2 = 1
第三轮的反推:
补上3个位置,然后模上当时的数组大小2,(1+3)%3 = 1
第二轮反推:
补上3个位置,然后模上当时的数组大小2,(1+3)%4 = 0
第一轮反推:
补上3个位置,然后模上当时的数组大小2,(0+3)%5 = 3
最终剩下的数字下标就是3,所以数组[0,1,2,3,4]每次删除第3个数字剩下来的数字就是3;
反推的规律就是:
当前的(index + 3) % 上一轮的数组剩余个数
python:
```python
class solution:
def joseph(self,n:int,m:int):
k = 0(设置删除到最后一轮剩下的数字坐标为0)
for i in range(2,n+1):
(反推从上一轮开始,上一轮剩下的是两个数字,最终是为了反推到最开始有n个数字的数组,因为需要反推到n个数字,所以要对n进行+1)
k = (m+k) % i 利用上面反推的规律
return k
(最后得出最开始的数组所在位置,因为数组都是从0开始的有序数组,那么得出的既是原始数组的下标也是原始数组的数字)