2017-06-13 66 views
-1

该程序用于查找模式1(0's)的重复次数1例如:1001,1001001但获取运行时间错误的值为较大的值 请给我建议我解决方案的错误发现大数值的重复次数

def patternCount(s): 

    count=0 

    for i in range(len(s)-1): 

     if s[i]=='1': 

      k=i 

      while s[k+1]=='0': 

       k=k+1 

      if s[k+1]=='1': 

       count+=1 

    return count 

    s = input() 

    result = patternCount(s) 

    print(result) 
+0

因此,你基本上只想计算'1'和'0'字符串中'0'运行的出现次数吗? –

+0

您为输入“1111”输出'3'。这是故意的吗?也就是说,你是用零长度来计算“0”组吗?在这种情况下,只需输出count('1') - 1'? –

+0

实际上没有它应该打印出模式1(0的任意数量)出现的次数1 EX:1001acvd00101并且是2,10101jhcz01001 ans是3那样的 –

回答

0

你的代码没有明显的错误。在最坏的情况下,只有可怜的复杂性是O(n^2)。当你遇到运行时错误时,我不知道这个值有多大。 所以我给你一个建议:跳过这里的代码。

def patternCountHelper(s,i,count): 
    if i >= len(s) : return count 
    elif s[i] == '0': 
     k=i 
     while s[k+1]=='0': 
      k=k+1 
     return patternCountHelper(s, k+1, count) 
    else: 
     return patternCountHelper(s, i+1, count+1) 
s = "1001001001" 
print(patternCountHelper(s,1,0)) 

有两个假定字符串必须以“1”开始并以“1”结尾以方便起见。

0

而不是复杂的嵌套循环,你可以只使用现有的库找到的连续0组并计数,例如使用itertools.groupby ...

>>> s = "10001001011" 
>>> sum(1 for k, g in itertools.groupby(s) if k == '0') 
3 

...或regular expressions

>>> len(re.findall('0+', s)) 
3 

但是,请注意,您当前的程序似乎也计数empty0,例如1111将返回3。在这种情况下,你可以使用与0*正则表达式和一些回顾后与前瞻:

>>> len(re.findall('(?<=1)0*(?=1)', s)) 
4 

还是只算在你的字符串的1数量和减去1,这是几乎一样的你的当前功能是干什么的,只是在一个略少令人费解的方式(假设字符串必须开始和结束1):

>>> s.count('1') - 1 
4 

鉴于你最近的评论,以下REG ular表达式应该可以工作:(?<=1)0+(?=1)这将检查一个或多个零的组0+,这两个零的前面都是(?<=1),并且跟在(?=1)之后。然后,只需使用re.findall and len`来查找和计算这些组。

>>> s = "0110010001jhcz00001000001000000" 
>>> re.findall('(?<=1)0+(?=1)', s) 
['00', '000', '00000'] 
>>> len(re.findall('(?<=1)0+(?=1)', s)) 
3