我正在处理一个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))

在本例中,当我使用sol.decodeAtIndex(s="ha22", k=15)运行函数时,我希望它从解码的字符串中返回一个字符,但当它进入if len(newstring) == k块时,newstring的长度为4,k的长度为15.因此,由于某些原因,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

推荐答案

首先,你的测试与任务不匹配:它要求大约s="ha22", k=5分,而你只有, k = 15分.这没有答案,因为s="ha22"的结果是字符串"hahahaha"--而这只有8个字符.在索引15处没有字符,并且您打破了给定的约束:"可以保证k小于或等于已解码字符串的长度."

您的代码中还有另一个无关的问题:

if len(newstring) == k:
    break

由于字符串可以按大于1的步长增长,因此您可能需要判断k是否‘大于或等于’长度.

您认为Python做错了事情,计算结果是4 == 15True--每当这样想的时候,您几乎肯定是错的.在一种地球上最流行的语言中,一个如此严重的问题就会被发现.更有可能的是你错过了一些重要的东西.在本例中,a.)一条解释问题的错误消息,b.)您答错了问题,c.)您的函数没有以您认为的方式退出循环.

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

以下是只有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(带有打印的解释).

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

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

不是很好,还是对的.

Python相关问答推荐

了解NP的形状.apply_along_axis输出

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

Tokenizer Docker:无法为Tokenizer构建轮子,这是安装pyproject.toml项目所需的

Pandas数据帧处理Pandas表中Json内的嵌套列表以获取后续Numpy数组

如何将自动创建的代码转换为类而不是字符串?

Pandas 按照特殊规则保留每n行

云上Gunicorn的Flask-socketIO无法工作

键盘.任务组

Pandas 群内滚动总和

在Python中管理多个OpenGVBO和VAO实例

在for循环中仅执行一次此操作

Python -根据另一个数据框中的列编辑和替换数据框中的列值

跟踪我已从数组中 Select 的样本的最有效方法

根据网格和相机参数渲染深度

Select 用a和i标签包裹的复选框?

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

在np数组上实现无重叠的二维滑动窗口

如何更新pandas DataFrame上列标题的de值?

Pandas Data Wrangling/Dataframe Assignment