我解决了一个问题,我必须找到数字之和,其数字仅由4,5和6组成。数字最多为x四,最多为五,最多为六。我成功通过了一些样本测试。但是,由于我不断遇到段错误,我无法通过其他测试用例。另外,我认为我的程序运行时间非常长。任何帮助减少运行时间,优化解决方案和防止段错误都将受到赞赏。 这是我在Python中的代码:
from itertools import permutations
x , y, z = raw_input().split(' ')
x = int(x)
y = int(y)
z = int(z)
max = ''
for a in range(z):
max += '6'
for b in range(y):
max += '5'
for c in range(x):
max += '4'
perms = [''.join(p) for p in permutations(max)]
chances = []
def substring(string):
possible = []
for x in range(len(string) + 1):
for y in range(x, len(string) + 1):
possible.append(string[x:y])
return possible
for d in perms:
chances += list(set(substring(d)))
chances = list(set(chances))
chances.remove('')
sum = 0
for nstr in chances:
sum += int(nstr)
print sum
答案 0 :(得分:0)
了解该计划的哪个部分消耗最多时间会很有帮助。看看下半部分,在调用排列之后,我看到你正在创建可能很大的列表(在chances
和permutations
中。在构建它们之后你转换为一个集合(以消除我认为的重复)然后再回到列表。为什么不使用单个集合,如下所示:
chances = set()
def substring(string):
for x in range(len(string) + 1):
for y in range(x, len(string) + 1):
chances.add(string[x:y])
for d in perms:
substring(d)
chances.remove('')
sum = 0
for nstr in chances:
sum += int(nstr)
print sum
我不知道这是否会解决你所有的问题,但它应该有所帮助。