LintCode 22. 平面列表 挑战用非递归方法尝试解答这道题

本文介绍了一种解决列表嵌套问题的算法实现,通过非递归和递归两种方式来展平多层嵌套的列表,提取出所有的整数元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用非递归方法尝试解答这道题:耗时:1481ms

思路:
1、遍历原始数组a(已将a的数据复制,即num)
1.2、如果num子元素是空值则跳过此次循环
1.3、如果子元素是列表,则将子元素列表中的元素取出添加至临时列表b中
1.4、如果子元素是数字或其它暂不做处理,此处目的为收集列表嵌套层数
1.5、循环完毕一次,嵌套层数加1
1.6、将子元素列表中的元素集合b,作为新的数组num再次进行循环。
1.7、将子元素列表集合b集合,准备为下一次保存列表子元素集合使用
1.8、如果子元素集合num为空,即b在循环中未得到赋值(列表子元素中不存在列表集合),退出循环
2、重新配置num为原始列表集合
2.1、循环max_num(最大嵌套层数)次,将所有列表子元素取出

2.2、循环一次,减少一次循环次数。每次均取出列表子元素,直至循环结束

class Solution(object):
    b = []
    num = [] 
    # @param nestedList a list, each element in the list 
    # can be a list or integer, for example [1,2,[1,2]]
    # @return {int[]} a list of integer
    def flatten(self, nestedList): 
        if type(nestedList) is not list:
            self.b.append(nestedList)
            return self.b
        self.num = nestedList.copy()    # 临时列表,将原始列表nestedList数据拷贝,用于计算
        self.max_num=0         # 记录列表最多嵌套层数 
        while(len(self.num)!=0): 
            for i in self.num:
                if i is None:
                    continue
                elif type(i) is list:
                    self.b.extend(i)
            self.max_num += 1
            self.num = self.b
            self.b = [] 
        self.num = nestedList.copy()    # 计算内层嵌套层数,临时使用
        self.number = self.max_num  # 调用函数函数时 用于保存更改循环次数

        # 取出当前列表子元素为整数集合,并赋值新的列表元素,用于下一次循环
        def foreach(num,max_num_):
            for g in range(0,len(num)):
                if num[g] is None:
                    continue
                elif type(num[g]) is list:
                    self.b.extend(num[g])
                else: 
                    self.b.append(num[g])
            self.number = self.number -1
            self.num = self.b
            self.b = []
    
        for g in range(0,self.max_num): 
            foreach(self.num,self.number)
        return self.num
    

用递归方法尝试解答这道题:1697 ms

class Solution(object):
    b = []

    # @param nestedList a list, each element in the list 
    # can be a list or integer, for example [1,2,[1,2]]
    # @return {int[]} a list of integer
    def flatten(self, nestedList):  
        if type(nestedList) is not list:
            self.b.append(nestedList)
            return self.b
        def digui(self,num): 
            for j in num:
                if type(j) is list:
                    digui(self,j)
                elif j is None:
                    pass
                else: 
                    self.b.append(j)
        for i in nestedList:
            if type(i) is list:
                digui(self,i)
            elif i is None:
                pass
            else:
                self.b.append(i)
        return self.b 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值