1. 程式人生 > >443. 壓縮字串(review)

443. 壓縮字串(review)

思路:

1.首先構建一個字串用於存放字元和其重複的次數

2.遍歷字串,碰到連續的字元計算其連續次數,如果連續相同字元的個數大於1則還需要把字串的次數統計減進去

3.最後把構建好的ans,list一下並順序用ans中的字元改變chars對應位置的字元並返回ans的長度

原文:https://blog.csdn.net/GrinAndBearIt/article/details/80624367 

class Solution(object):
    def compress(self, chars):
        """
        :type chars: List[str]
        :rtype: int
        """
        ans = ''
        length = len(chars)
        i = 0
        while i<length:
            count = 1
            while i<(length-1) and chars[i+1]==chars[i]:
                count+=1
                i+=1
            # print(count) #2 2 3
            ans += chars[i]
            # print(ans)
            if count>1:
                ans += str(count)
            i+=1
        # print(ans)
        ans = list(ans)
        for j in range(len(ans)):
            chars[j] = ans[j]
        return len(ans) 

總結:

i = 1
while i<length:
    count = 1
    if i<(length-1) and chars[i-1]==chars[i]:
        count+=1
        i+=1

這種方式計算,最後連著的ccc,只能計算成2,無法統計到3。原因還沒明白。

改成兩個while之後就能統計到3了。

so,統計一個list中,連續出現的個數用兩個while。

這道題花了很久,是?吧。。。

還有一種,類似快排的思想,以後再看吧,今天花的時間有點多。

class Solution(object):
    def compress(self, chars):
        left = i = 0
        while i < len(chars):
            char, length = chars[i], 1
            while (i + 1) < len(chars) and char == chars[i + 1]:
                length, i = length + 1, i + 1
            chars[left] = char
            if length > 1:
                len_str = str(length)
                chars[left + 1:left + 1 + len(len_str)] = len_str
                left += len(len_str)
            left, i = left + 1, i + 1
        return left