【问题标题】:Checkio long repeat challengeCheckio 长重复挑战
【发布时间】:2017-08-15 16:25:20
【问题描述】:

在挑战中,您被要求找出由相同字母组成的最长子串的长度。例如,“aaabbcaaaa”行包含四个具有相同字母“aaa”、“bb”、“c”和“aaaa”的子字符串。最后一个子字符串是最长的,这使它成为答案。输入:字符串。输出:诠释。示例:

long_repeat('sdsffffse') == 4

long_repeat('ddvvrwwwrggg') == 3

这是我的代码:

def long_repeat(text):
    text = list(text)
    counter = []
    c = []

    for i in range(len(text)):
        if text[0] == text[1]:
            c.append(text.pop(0))
        else:
            counter.append(c)
            c = []
    print text # should be empty 
    print counter # should contain a lists of the repeated letters

输出:

>>>long_repeat('aaabbccc')
['a', 'b', 'b', 'c', 'c', 'c', 'c']
[['a', 'a'], [], [], [], [], [], []]

在这种情况下,为什么循环在完成第一个字母“a”时停止?

【问题讨论】:

  • 我很困惑这甚至是如何工作的。您应该会收到类似于 'str' object has no attribute 'pop' 的错误。
  • 我把文本变成了第二行的列表
  • 你做到了,但 pop 是在 text 上调用的,而不是在 txt 上调用的。
  • pop从列表中迭代它是一个非常糟糕的主意。
  • @belle:迭代使用索引;因此,您首先查看元素 0,然后查看元素 1,然后查看元素 2。从一开始弹出将所有内容向左移动一步;因此,索引 1 处的内容现在位于索引 0 处,但 迭代索引不会调整。因此,如果您只处理元素 1,则接下来查看索引 2,但那是 pop 之前索引 3 处的元素,索引 2 处的元素不再存在,而是位于索引 1..

标签: python python-2.7


【解决方案1】:

循环不会停止。您的 else 语句不会将列表向前移动(此处没有 pop)。顺便说一句,您的逻辑并不完全正确。而且,每个回合都弹出角色然后收集它不是一个好主意。您可以使用整数来记录您需要的所有必要信息,包括位置、当前计数、最大计数等。

【讨论】:

    【解决方案2】:

    test[0] != text[1] 例如当输入在“ab”时,您不会将 a 附加到 c 变量

    此外,Python 字符串没有“pop”方法,因此它退出了(密切注意返回的错误)。

    在流行音乐中使用类似的东西

    c.append(text[-1]) 
    text = text[:-1]
    

    【讨论】:

    • 谢谢,我注意到每个循环中的一个字母会丢失,我打算稍后再处理。我会带上你的好运,需要一些:)