在RLE算法中避免Python一次出错

在RLE算法中避免Python一次出错,python,algorithm,off-by-one,Python,Algorithm,Off By One,编辑:这似乎比一个接一个的错误有更多的错误 我在下面的简单算法中发现了一个off-by-one错误,该算法应该显示字符串中的字母计数,沿着运行长度编码的行 我可以理解为什么最后一个字符没有添加到结果字符串中,但是如果我增加I的范围,我会得到索引超出范围,原因很明显 我想从算法设计的角度了解这里的概念问题,以及如何让代码正常工作 我是否需要一些特殊的案例代码来处理原始字符串中的最后一项?或者,比较当前字符与前一个字符更有意义,尽管这在算法开始时会造成问题 这种算法是否有一种通用方法,将当前元素与前

编辑:这似乎比一个接一个的错误有更多的错误

我在下面的简单算法中发现了一个off-by-one错误,该算法应该显示字符串中的字母计数,沿着
运行长度编码的行

我可以理解为什么最后一个字符没有添加到结果字符串中,但是如果我增加
I
范围,我会得到
索引超出范围,原因很明显

我想从算法设计的角度了解这里的概念问题,以及如何让代码正常工作

我是否需要一些特殊的案例代码来处理原始字符串中的最后一项?或者,比较当前字符与前一个
字符更有意义,尽管这在算法开始时会造成问题

这种算法是否有一种通用方法,将当前元素与前一个/下一个元素进行比较,从而避免索引超出范围的问题

def encode(text):
    # stores output string
    encoding = ""
    i = 0

    while i < len(text) - 1:
        # count occurrences of character at index i
        count = 1
        while text[i] == text[i + 1]:
            count += 1
            i += 1

        # append current character and its count to the result
        encoding += text[i] + str(count) 
        i += 1

    return encoding

text = "Hello World"
print(encode(text))
# Gives H1e1l2o1 1W1o1r1l1
def编码(文本):
#存储输出字符串
encoding=“”
i=0
而我
没错,如果最后一个字符与前一个字符不同(
d
,在您的情况下),您应该让外部循环处理最后一个字符

然后,您的算法在全局范围内是良好的,但在查找最后一个字符时会崩溃。此时,
text[i+1]
变得非法

要解决这个问题,只需在内部循环中添加一个安全检查:
whilei+1

def编码(文本):
#存储输出字符串
encoding=“”
i=0
而我
如果你坚持你的策略,你必须检查
i+1
。 这会产生如下结果:

def encode(text): 
    L = len(text) 
    start = 0 
    encoding = '' 
    while start < L: 
        c = text[start] 
        stop = start + 1 
        while stop < L and text[stop] == c: 
            stop += 1 
        encoding += c + str(stop - start) 
        start = stop 
    return encoding

这允许您只枚举感觉更像python的输入。

您对外循环和内循环使用相同的计数器(
pos
)-这是一个非常糟糕的主意,特别是因为外循环是对内循环的
。如果改用
while
循环,可能会起作用。另外,为什么要在外循环的末尾增加
pos
?因为我将
while
的外循环更改为
。我现在将编辑…
,而我+1
在事后看来是如此简单和明显。然而,我认为这是一个辉煌的时刻。
def encode2(text): 
     start = 0 
     encoding = '' 
     for i,c in enumerate(text): 
         if c != text[start]: 
             encoding += text[start] + str(i-start) 
             start = i
     if text:
         encoding += text[start] + str(len(text)-start) 
     return encoding