提问人:Tumasotis 提问时间:9/29/2023 最后编辑:GrismarTumasotis 更新时间:9/29/2023 访问量:74
字符串长度与整数的比较似乎返回错误的答案
String length comparison to an integer seems to return wrong answer
问:
我正在研究 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) == k
newstring
k
4 == 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
答:
首先,你的测试与作业不匹配:它询问 ,你有 .这没有答案,因为结果在字符串中 - 而且只有 8 个字符长。索引 15 处没有字符,并且您违反了给定的约束“保证 k 小于或等于解码字符串的长度”。s="ha22", k=5
, k = 15
s="ha22"
"hahahaha"
代码中还有另一个不相关的问题:
if len(newstring) == k:
break
由于字符串可以以大于 1 的步长增长,因此您可能需要检查长度是否“大于或等于”。k
你认为 Python 把事情弄错了,并进行了评估——每当有这样的事情发生时,你几乎肯定会出错。在地球上最流行的语言中,会发现一个令人震惊的问题。你总是更有可能错过一些重要的东西。在本例中,a.)解释问题的错误消息,b.)你答错了问题,c.)你的函数不会像你认为的那样退出循环。4 == 15
True
请注意,无论哪种方式,它都可以工作 - 在许多情况下,它只会完成整个解码的字符串,并且仍然返回正确的答案。
下面是只有 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))
输出 、 和(带有打印的说明)。o
h
a
a
请注意,如果撤消修复,则会获得所添加问题的以下输出:
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
不是很好,仍然正确。
评论
So, 4 == 15 evaluates to true, for some reason and that breaks the loop
它不会,你的循环就结束了。没有答案。s="ha22", k=15
IndexError
IndexError: string index out of range
s="ha22", k=15
不是此算法的有效输入;解码后的字符串的长度应仅为 8,索引 15 处没有字符。网站上的示例输入是......s="ha22", k=5