avatar

Catalog
圆圈中最后剩下的数字

题目描述

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

解题思路

假设数字:[0,1,2,3]
m:4
思路:
最后一次剩下的值,序号idx一定为0,所以,我们希望反推回去,看下这个序号为0的数,在每一次的删除时,是在哪个位置。
正向:
第一次,删除3,序号为3,[0,1,2]
第二次,删除0,序号为0,[1,2]
第三次,删除2,序号为1,[1]
留下数字1,序号为0

反推:
最后一次删除后,留下一个数字,序号为0
下面计算,这个留下的数字在上一次删除时,处于的序号(希望依次可以得到最初时,该数字的序号,也就是解)
在本次假设中,上一轮剩下两个数,所以加上m,取模2
以此类推
人数为1: 0
人数为2: (0+m) % 2
人数为3: ((0+m) % 2 + m) % 3
人数为4: (((0+m) % 2 + m) % 3 + m) % 4

代码

Code
1
2
3
4
5
6
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
idx = 0
for i in range(2, n+1):
idx = (idx + m) % i
return idx
Author: kim yhow
Link: http://yoursite.com/2020/03/30/面试题62-圆圈中最后剩下的数字/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶