面试题62:孩子们的游戏(圆圈中最后剩下的数字)

以n = 5,m = 3为例子
第一次: lst = [0,1,2,3,4], 删除m-1,即删除元素2,得到[0,1,3,4],记得这个时候要从删除后的元素从索引0开始,将[0,1]移动到4的后面得到[3,4,0,1]
第二次: lst = [3,4,0,1] , 删除m-1,即删除元素0,得到[3,4,1], 记得这个时候要从删除后的元素从索引0开始,将[3,4]移动到1的后面得到[1,3,4]
第三次: lst = [1,3,4] , 删除m-1,即删除元素4,得到[1,3], 记得这个时候要从删除后的元素从索引0开始,[1,3]不变,长度<m
换到第2个while:
第一次:m-len(lst) = 1,构造[1,3,1],将第一个1append到3的后面,删除最后一个1的同时将第一个1也删除,剩余 [3]
可以看出时间空间复杂度都不如人意!!!!!
# -*- coding:utf-8 -*-
class Solution:
def LastRemaining_Solution(self, n, m):
# write code here
if n == 0:
return -1
# 1.获取要排序的列表,需要删除第m-1个数据
lst = list(range(n))
while len(lst) > (m-1):
del lst[m-1]
# 重新写这个list,举个例子原来是[0,1,2,3,4,5,6,7,8],m =3,删除 lst[m-1]
# 得到:[0,1,3,4,5,6,7,8],这个时候我们需要将前2个元素删除并append到8的后面
temp = lst[0:m-1]
for i in range(m-1):
lst.append(lst[0])
del lst[0]
# while结束后剩下m-1个数据,这个时候就没办法直接去删除第m-1个数据了
while len(lst) != 1:
#这个时候len(lst)肯定小于m
temp_index = m-len(lst)
for i in range(temp_index):
lst.append(lst[i])
del lst[-1]
for j in range(temp_index):
del lst[0]
return lst[0]
需要注意:
del lst[-1]
lst.remove(lst[-1])

总结:如果lst中出现相同元素,会删除第一个出现的元素;
也就是说remove只会删除指定位置上出现的元素,这个题lst[1,3,1],要删除lst[-1]也就是元素1,remove知道删除元素1而已,具体哪个位置他并不关心。

浙公网安备 33010602011771号