上周末,我正在研究HackerRank上的Ad Infinitum挑战。
如果每个子序列被认为是整数,则一个问题是计算有限序列的所有子序列的总和。
例如,序列4,5,6会给出答案4 + 5 + 6 + 45 + 46 + 56 + 456 = 618。
我发现了一个递归并在下面编写了Python代码。它解决了5/13个测试用例。
其余的8/13测试用例存在运行时错误。
我希望有人可以在代码中监视效率低下的地方,以及如何加速它们。或者,帮助我决定一定是我的递归不是最好的策略。
# Input is a list, representing the given sequence, e.g. L = [4,5,6]
def T(L):
limit = 10**9 + 7 # answer is returned modulo 10**9 + 7
N = len(L)
if N == 1:
return L[0]
else:
last = L[-1]
K = L[:N-1]
ans = T(K)%limit + 10*T(K)%limit + (last%limit)*pow(2,N-1,limit)
return ans%limit
答案 0 :(得分:0)
嗯,你想要组合:
from itertools import combinations
def all_combinations(iterable):
for r in range(len(digits)):
yield from combinations(digits, r+1)
并且您想将它们转换为整数:
def digits_to_int(digits):
return sum(10**i * digit for i, digit in enumerate(reversed(digits)))
你要总结一下:
sum(map(digits_to_int, all_combinations([4, 5, 6])))
然后专注于速度。
答案 1 :(得分:0)
假设你的意思是连续的后续序列。
test = [4, 5, 6]
def coms(ilist):
olist = []
ilist_len = len(ilist)
for win_size in range(ilist_len, 0, -1):
for offset in range((ilist_len - win_size) + 1):
subslice = ilist[offset: offset + win_size]
sublist = [value * (10 ** power) for (power, value) in enumerate(reversed(subslice))]
olist.extend(sublist)
return olist
print sum(coms(test))
答案 2 :(得分:0)
这是我提交的同一问题(Manasa和子序列)。 https://www.hackerrank.com/contests/infinitum-may14/challenges/manasa-and-sub-sequences
我希望这会帮助你想出更好的方法。
ans = 0
count = 0
for item in raw_input():
temp = (ans * 10 + (count + 1)*(int(item)))%1000000007
ans = (ans + temp)%1000000007
count = (count*2 + 1)%1000000007
print ans