Python代码需要太多时间才能运行

时间:2018-05-25 03:11:48

标签: python for-loop replace scripting

我遇到的问题是改变所有" o"与" ko"和" k"用" ok"从" ok"开始1000次,然后计算有多少连续的o。一旦达到两位数,代码就会显着减慢,我不确定如何重构我的代码。

import string
y ="ok"
z = ""
for c in range(1000):
    for x in y:
        if str(x) == "o":
            x = x.replace("o", "ko")
            z += x
        else:
            x = x.replace("k", "ok")
            z += x
        y = z
    z = ""
    print(y,c)
y = y.replace("k", " ")
y = y.count("oo")
print (y)

来源问题

  

在向朋友咆哮后,基思收到一封信,上面写着一封信:" K"。在这种低调的反应中,他回答了他的朋友回复的#34; OK"" KOOK。"作为一个精明的人,基思确定了他的朋友发起的模式:随后的消息包括基思和他的朋友替换每个" K"用" OK"和" O"与" KO"。帮助Keith在1000回复的消息中找到长度为2或更大的连续Os的集合数。第一条消息" K",不算作回复。给你的答案mod 10 ^ 9 + 7。

     

澄清什么构成"长度为2或更长的连续Os的集合":   KOKOOKOOOKOOOO - 在这个字符串中有三组长度为2或更大的连续K(" OO"," OOO"," OOOO")。

2 个答案:

答案 0 :(得分:2)

这里的主要问题是每个步骤的字母数量加倍 - 例如,在第40步中,有2 ^ 40个字母。如果每个字母占用一个字节,那就是大约几字节的字母。当然,与存储所有1000个步骤所需的空间相比,这只是一小部分。所以,不,粗暴地强迫这样的问题是不可行的。

相反,目标可能是认识到模式是Thue-Morse sequence,除非有时翻转。 '○'和' k'对应于0或1,它并不特别重要。您可以搜索维基百科页面,以查找序列中连续“1”的最大数量。

答案 1 :(得分:-1)

y ="ok"
for c in range(1000):
    y = y.replace('o','ko')
    y = y.replace('k','ok')
    print(y,c)

你可能不必在循环中搜索' o'和' k'替换会为你做,仍然需要很长时间。