【python程序员面试宝典|程序员算法宝典】

【python】游程编码?

2019-07-26  本文已影响0人  阿牛02

题目:字符串“aaaabcccaa”,编码后位变为“4a1b3c2a”。解码则是“3e4f2e”,解码后位”eeefffee“

分析:基本思路是遍历字符串,然后统计字符出现的次数,再把出现的次数和字符组合在一起。代码不难,但是容易再边界条件上出错。无论是编码还是解码,算法都需要把字符串中的每个字符遍历一次,如果字符串的长度为n,那么算法的时间复杂度为O(n),在编码和解码过程中,代码需要分配一个数组来容纳编码或解码后的字符串,一次空间复杂度为O(n).

code

(1)

def RLEncode(s):

    encodeStr = []

    last = s[0]

    count = 0

    for i in range(len(s)):

        # 遍历每个字符,统计它连续出现的次数

        if s[i] == last:

            count += 1

        else:

            encodeStr.append(str(count))

            encodeStr.append(last)

            count = 1

            last = s[i]

    # 统计最后一个字符及其出现次数,这是容易忽略的边界条件

    encodeStr.append(str(count))

    encodeStr.append(last)

    return ''.join(encodeStr)

if __name__ == "__main__":

    s = 'aaabcccaa'

    print(RLEncode(s))

(2)解码。

def RLEDecode(s):

    decodeStr = []

    i = 0

    digitCount = 0

    while i < len(s):

        # 统计数字字符的个数,它们表示后面字符要出现的次数

        if s[i].isdigit() is True:

            digitCount += 1

            i += 1

        else:

            # 把把数字字符转换为数字

            count = int(s[i - digitCount:i])

            c = s[i]

            # 根据次数添加字符

            for j in range(count):

                decodeStr.append(c)

            i += 1

            digitCount = 0

    return ''.join(decodeStr)

if __name__ == "__main__":

    s = "11a1b3c2a"

    print(RLEDecode(s))

上一篇 下一篇

猜你喜欢

热点阅读