0
,
1
,
,
n
−
1
0,1,,n-1
0,1,,n−1共
n
n
n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
题目并不难,若用数组
l
l
l表示圆圈,关键在于当前索引加上步数(
i
n
d
e
x
+
m
−
1
index+m-1
index+m−1)若超出数组范围应该如何处理。
不难发现,从任意索引移动
m
−
1
m-1
m−1步时会回到原索引位置,因此当
i
n
d
e
x
+
m
−
1
index+m-1
index+m−1超出数组范围时,进行
(
m
−
1
)
%
l
e
n
(
l
)
(m-1)\,\,\,\%\,\,\,len(l)
(m−1)%len(l)运算,运算结果即为剩下需要移动的步数,更新索引即可。
def last_remaining(n, m):
index = 0
l = list(range(n))
while len(l) > 1:
if index + m - 1 <= len(l) - 1:
index += m - 1
l.pop(index)
if index == len(l):
index = 0
else:
move = (m - 1) % len(l)
if index + move <= len(l) - 1:
index += move
l.pop(index)
if index == len(l):
index = 0
else:
index = move - (len(l) - index)
l.pop(index)
if index == len(l):
index = len(l) - 1
return l[0]