22. 平面列表

题目

给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。

 注意事项

如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表。

样例

给定 [1,2,[1,2]],返回 [1,2,1,2]

给定 [4,[3,[2,[1]]]],返回 [4,3,2,1]

挑战 

请用非递归方法尝试解答这道题。

题解

非递归的做法,stack作为一个容器,来保存每一层的数据
当我们遇到一个元素是列表,我们就把当前列表存起来,把这个元素当作新列表,再枚举处理,再继续上面的操作,
直到某个只有数字的元素,则开始回溯,把stack的列表一个一个pop出来继续处理,直到stack全部处理结束。
这题还有注意的是进来的可能只是一个数字,所以我先[,]下,反正后面会自己解开。还有就是有一些空集合,导致我代码提早跳出,代码还能写更漂亮才对。

 

def flatten(nestedList):
    idx = 0
    lst = []
    stack = []
    curList = [nestedList,]
    while 1:
        if type(curList[idx]) == list:
            stack.append([curList, idx])
            curList = curList[idx]
            idx = -1

        else:
            lst.append(curList[idx])
                
        idx += 1
        if idx == len(curList):
            while 1:
                if len(stack) == 0:
                    return lst
                curList, idx = stack.pop()
                idx += 1
                if idx < len(curList):
                    break

 

posted on 2018-03-21 19:18  usp10  阅读(131)  评论(0编辑  收藏  举报

导航