字符串长度与整数的比较似乎返回错误的答案

String length comparison to an integer seems to return wrong answer

提问人:Tumasotis 提问时间:9/29/2023 最后编辑:GrismarTumasotis 更新时间:9/29/2023 访问量:74

问:

我正在研究 LeetCode 问题 (880.Decoded String at Index),我需要按照特定规则解码字符串,并且我遇到了一个我不明白的问题。我正在使用循环来构建解码的字符串,但是当我将其长度与 k 的值进行比较时,它的行为出乎意料。

class Solution(object):
    def decodeAtIndex(self, s, k):
        newstring = str()
        for i in range(len(s)):
            print(f"checking ({newstring})-({len(newstring)}) is equals to ({k})")
            if len(newstring) == k:
                break
            if s[i].isalpha():
                newstring += s[i]
                continue
            currentstring = newstring
            for j in range(int(s[i])-1):
                newstring += currentstring
        return newstring[k-1]

sol = Solution()

print(sol.decodeAtIndex(s="leet2code3", k=10))
print(sol.decodeAtIndex(s="ha22", k=15))

在此示例中,当我使用 运行函数时,我希望它从解码的字符串中返回一个字符,但是当它进入块时,长度为 4 且为 15。因此,由于某种原因,计算结果为 true,这会中断循环,导致语法错误,因为它试图返回sol.decodeAtIndex(s="ha22", k=15)if len(newstring) == knewstringk4 == 15

我不太明白第二个测试中的问题,因为第一个测试没有问题,并且在达到正确的长度时停止生成新字符串。

错过了使用提供的代码运行也会输出此错误的事实:

Traceback (most recent call last):
  File "<path>\problem.py", line 19, in <module>
    print(sol.decodeAtIndex(s="ha22", k=15))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<path>\problem.py", line 14, in decodeAtIndex
    return newstring[k-1]
           ~~~~~~~~~^^^^^
IndexError: string index out of range
Python 字符串 算法

评论

2赞 tkausl 9/29/2023
So, 4 == 15 evaluates to true, for some reason and that breaks the loop它不会,你的循环就结束了。没有答案。s="ha22", k=15
0赞 quamrana 9/29/2023
这是你正在做出的一个非常有力的断言。你最好有一些证据来支持这一点。(它会导致 ,而不是语法错误)IndexError
1赞 JonSG 9/29/2023
IndexError: string index out of range
2赞 jasonharper 9/29/2023
s="ha22", k=15不是此算法的有效输入;解码后的字符串的长度应仅为 8,索引 15 处没有字符。网站上的示例输入是......s="ha22", k=5
0赞 wjandrea 9/29/2023
逐字发布错误消息

答:

1赞 Grismar 9/29/2023 #1

首先,你的测试与作业不匹配:它询问 ,你有 .这没有答案,因为结果在字符串中 - 而且只有 8 个字符长。索引 15 处没有字符,并且您违反了给定的约束“保证 k 小于或等于解码字符串的长度”。s="ha22", k=5, k = 15s="ha22""hahahaha"

代码中还有另一个不相关的问题:

if len(newstring) == k:
    break

由于字符串可以以大于 1 的步长增长,因此您可能需要检查长度是否“大于或等于”。k

你认为 Python 把事情弄错了,并进行了评估——每当有这样的事情发生时,你几乎肯定会出错。在地球上最流行的语言中,会发现一个令人震惊的问题。你总是更有可能错过一些重要的东西。在本例中,a.)解释问题的错误消息,b.)你答错了问题,c.)你的函数不会像你认为的那样退出循环。4 == 15True

请注意,无论哪种方式,它都可以工作 - 在许多情况下,它只会完成整个解码的字符串,并且仍然返回正确的答案。

下面是只有 4 个更改的代码:正确问题、第 3 个问题、用于演示代码问题的第 4 个问题以及修复:

class Solution(object):
    def decodeAtIndex(self, s, k):
        newstring = str()
        for i in range(len(s)):
            print(f"checking ({newstring})-({len(newstring)}) is equals to ({k})")
            # fixed:
            if len(newstring) >= k:
                break
            if s[i].isalpha():
                newstring += s[i]
                continue
            currentstring = newstring
            for j in range(int(s[i])-1):
                newstring += currentstring
        return newstring[k-1]

sol = Solution()

print(sol.decodeAtIndex(s="leet2code3", k=10))
#this is the correct problem:
print(sol.decodeAtIndex(s="ha22", k=5))
print(sol.decodeAtIndex(s="a2345678999999999999999", k=1))

#an extra problem:
print(sol.decodeAtIndex(s="a22bc2c222222222", k=10))

输出 、 和(带有打印的说明)。ohaa

请注意,如果撤消修复,则会获得所添加问题的以下输出:

checking ()-(0) is equals to (10)
checking (a)-(1) is equals to (10)
checking (aa)-(2) is equals to (10)
checking (aaaa)-(4) is equals to (10)
checking (aaaab)-(5) is equals to (10)
checking (aaaabc)-(6) is equals to (10)
checking (aaaabcaaaabc)-(12) is equals to (10)
checking (aaaabcaaaabcc)-(13) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabcc)-(26) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(52) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(104) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(208) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(416) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(832) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(1664) is equals to (10)
checking (aaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabccaaaabcaaaabcc)-(3328) is equals to (10)
a

不是很好,仍然正确。