443. 壓縮字串(review)
阿新 • • 發佈:2018-12-16
思路:
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