面试题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而已,具体哪个位置他并不关心。

posted @ 2019-08-09 10:37  lililili——  阅读(236)  评论(0)    收藏  举报