首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sum等于数字的子字符串

sum等于数字的子字符串
EN

Stack Overflow用户
提问于 2021-10-21 20:44:34
回答 2查看 78关注 0票数 0

我有一个字符串S='n1,n2,n3.nk‘(例如’3,0,4,0,3,1,0,1,0,1,0,1,0,0,5,0,4,2‘)和一个数字m= S (es 9)。我想知道有多少个sum等于m的子串。

我使用了这段代码,它似乎是有效的。我有一个1秒的超时时间,这段代码在很长的数字串测试中失败了几毫秒。我该如何优化它呢?

代码语言:javascript
复制
m = 9
numbers = list(map(int,S.split(",")))
result  = 0
sums    = numbers
for i in range(len(numbers)):
    result += sums.count(m)
    sums   = [a+b for a,b in zip(sums,numbers[i+1:]) ]
print(result)``` 
EN

回答 2

Stack Overflow用户

发布于 2021-10-21 20:47:41

代码语言:javascript
复制
m = 9

c = 0
for i in range(len(numbers)):
    for j in range(len(numbers)-i):
        sum = 0
        for k in numbers[i:i+j]:
            sum += k
            if sum == m:
                c += 1
            if sum > m: # strict >, thanks to Tim Roberts
                break

print(c)
票数 1
EN

Stack Overflow用户

发布于 2021-10-21 22:37:52

一个计算前缀和的O(n)解。例如,如果前缀总和是13,那么要得到9,您需要减去前缀总和4,因此请查看前缀总和4出现的频率:

代码语言:javascript
复制
from collections import Counter

S = '3,0,4,0,3,1,0,1,0,1,0,0,5,0,4,2'
m = 9

numbers = map(int, S.split(","))
result = 0
presum = 0
presums = Counter([presum])
for number in numbers:
    presum += number
    result += presums[presum - m]
    presums[presum] += 1

print(result)

也适用于负数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69668561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档