编写一个函数,如果给定的字符串恰好有 6 个字符,则 returns 为真

Writing a function that returns true if given string has exactly 6 characters

我正在尝试编写一个函数,如果给定字符串 正好 6 个具有相同值的连续字符,则 return 为真或假。如果字符串多于或少于 6,它将 return false:

不允许使用列表、集合或导入任何包。我只限于 while 循环、for 循环和使用基本数学运算

下面显示了两个示例运行:

Enter a string: 367777776  
True
Enter a string: 3677777777776  
False

请注意,虽然我输入的是数字,但它实际上是函数参数中的一个字符串,例如:consecutive('3777776')

我尝试将字符串转换为 ASCII table,然后尝试过滤掉其中的数字。不过,我

def consecutive(x):
    storage= ' '
    acc=0
    count=0
    for s in x:
        storage+= str(ord(s)) + ' '
        acc+=ord(s)
        if acc == acc:
            count+=1
    for s in x-1:
        
    return count

我的目的是比较字符串中前一个字符的ASCII码和当前字符的ASCII码。如果 ASCII 不匹配,我将为其添加一个累加器。累加器将列出重复的数量。从那里,我将执行一个 if-else 语句来查看它是大于还是小于 6 但是,我很难将我的想法转化为 python 代码。

有人可以帮助我吗?

你可以使用递归。遍历所有字符,检查每一个字符,看看接下来的 6 个字符是否相同。如果是这样,return 正确。如果到达数组的末尾(甚至在末尾的 6 个字符内),return false.

有关递归的更多信息,请查看:https://www.programiz.com/python-programming/recursion

会允许这样的事情吗?

def consecF(n):
    consec = 1
    prev = n[0]
    for i in n:
        if i==prev:
            consec+=1
        else:
            consec=1
        if consec == 6:
            return True
        prev = i
        
    return False
n = "12111123333221"
print(consecF(n))

您可以尝试双指针方法,其中左指针固定在某个数字的第一个实例,只要看到数字,右指针就会移动。

def consecutive(x):
    left = 0
    while left != len(x):
        right = left
        while right < len(x) and x[right] == x[left]:
            right += 1
        length = (right - 1) - left + 1 # from left to right - 1 inclusive, x[left] repeated
        if length == 6: # found desired length
            return True
            
        left = right

    return False # no segment found
     
tests = [
    '3677777777776',
    '367777776'
]

for test in tests:
    print(f"{test}: {consecutive(test)}")

输出

3677777777776: False
367777776: True

这是一个很好的开始!

几点评论:

  • 变量 storageacc 起着相同的作用,但比它们必须的要复杂一点。当您到达字符 s 时,您只想知道 s 是否与前一个字符相同。所以,你只需要存储之前看到的字符。
  • 条件acc == acc 永远为真。我想你的意思是 acc == s?
  • 当你遇到相同的字符时,你正确地增加计数count += 1。但是,当我们更改字符时,您应该重新设置计数。

考虑到这些意见,我修改了您的代码,然后留空了一些部分供您填写。我还将 storageacc 重命名为 previous_char,我认为这更明确。

def has_6_consecutive(x):
    previous_char = None
    count = 0
    for s in x:
        if s == previous_char:
            ???
        elif count == 6:
            ???
        else:
            ???
            previous_char = ???
    ???

您应该存储当前的重复字符序列

def consecutive(x):
    sequencechar = ' '
    repetitions = 0
    for ch in x:
        if ch != sequencechar:
            if repetitions == 6:
                break
            sequencechar = ch
            repetitions = 1
        else:
            repetitions += 1
    return repetitions == 6

如果可以,我不会给出完整的解决方案,但这仍然是一个简单的问题。不过有些地方还是要注意的。

如您所见,当前序列已存储,当序列结束并开始新序列时,一旦找到正确的序列,它就会跳出 for 循环。

同样在for循环正常结束后,检查最后一个序列(在循环中没有完成)。