列表及其子集和的最小不包含整数

要求描述:一个整数列表,找到最小的整数,满足该数不在这个列表中,并且不能等于任何子列表的和,例如:a = [1, 2, 5, 7],结果为4,如果a = [1, 2, 2, 5, 7]结果为18。

class MixNum(object):
    def __init__(self, ls):
        # 接收传入的列表
        self.ls = ls
        # 累积存储子列表的和
        self.sum_ls = []
        # 列表和子列表的和
        self.list_target = []
        # 最小整数
        self.mix_int = 0

    def format_ls(self):
        # 格式化ls为有序的嵌套列表[ [] ]
        self.ls.sort()
        lis = [self.ls]
        return lis

    def _get_sum_list(self, lis):
        # 将嵌套列表各项求和,并加入sum_ls
        for ls in lis:
            sum_num = 0
            for i in ls:
                sum_num += i
            self.sum_ls.append(sum_num)

    def get_child_list(self, lis):
        # 获取ls的所有子列表
        list_child = []
        length = len(lis[0])
        # 将每次的子列表求和存入sum_ls
        self._get_sum_list(lis)
        # 递归结束标志
        if length == 2:
            return
        for i in lis:
            for j in range(length):
                list_child.append(i[:j]+i[j+1:])
        # 开启递归,注意要求有return
        return self.get_child_list(list_child)

    def get_list(self):
        # 将ls跟ls各个子集做合并,去重获取有序list_target
        self.list_target = self.ls + self.sum_ls
        self.list_target = list(set(self.list_target))
        self.list_target.sort()

    def get_num(self):
        # 遍历list_target寻找最小整数
        length = len(self.list_target)
        for i in range(1, length):
            if self.list_target[i] != self.list_target[i-1] + 1:
                return self.list_target[i]-1
        return self.list_target[length-1] + 1

    def run(self):
        # 启动
        ls = self.format_ls()
        # 格式化列表
        self.get_child_list(ls)
        # 获取所有子列表并求和存入sum_ls
        self.get_list()
        # 获取list_target
        self.mix_int = self.get_num()
        # 将最小整数保存到对象属性中


if __name__ == '__main__':
    ls1 = [1, 2, 5, 7]
    ls2 = [1, 2, 2, 5, 7]
    M = MixNum(ls2)
    # 创建对象,传入初始化参数ls
    M.run()
    # 启动
    b = M.mix_int
    # 对象属性中取出最小整数
    print(b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值