要求描述:一个整数列表,找到最小的整数,满足该数不在这个列表中,并且不能等于任何子列表的和,例如: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)