【发布时间】:2018-01-16 04:07:56
【问题描述】:
此功能的目标和条件如下:
目标1. 所有这些数字的总和是数字的总和 ==
sum_dig
2. 自己的数字之和的最小值 ==
sum_dig
3.自身digi之和的最大数 ==
sum_dig
条件
4. 数字必须按升序排列
5. 位数 ==
digs
示例
find_all(10, 3) 应该返回 [8, 118, 334]
find_all(27, 3) 应该返回 [1, 999, 999]
find_all(84, 4) 应该返回 []
find_all(35, 6) 应该返回 [123, 116999, 566666]
附言抱歉,我是新手,如果有任何问题,请告诉我^^ 提前谢谢!
def find_all(sum_dig, digs):
ls = set(n for n in set(''.join(sorted(str(i))) for i in range(int('1'*digs),int('9'*digs)+1) if '0' not in str(i)) if sum(int(i) for i in n) == sum_dig)
if len(ls) ==0:
return []
return [len(ls),int(min(ls)),int(max(ls))]
可读版本
def find_all(sum_dig, digs):
#find int in increasing order within range
ls = set(''.join(sorted(str(i))) for i in range(int('1'*digs),int('9'*digs)+1))
#find sum of it's digi == sum_dig within min. list
ls = set(n for n in ls if '0' not in n and sum(int(i) for i in n) == sum_dig)
if len(ls) ==0:
return []
return [len(ls),int(min(ls)),int(max(ls))]
【问题讨论】:
-
您在这里所做的是暴力搜索,其复杂性呈指数级增长(即执行时间增长得非常快)。使用动态规划可以更有效地解决这个特定问题
-
首先是让代码可读。格式化,使其无需滚动即可阅读。带有 3 个 for 子句的生成器表达式很难阅读。
-
谢谢 Marat,对不起,我还在学习,你能解释一下吗?百万谢谢!
-
谢谢特里,因为目标是最大化性能,所以我编写了这样的代码。我发现这有点快,然后在测试后写得更有结构。无论如何,我添加了可读版本以便于阅读^^