[LeetCode]443. 壓縮字符串 ★

題目描述

給定一組字符,使用原地算法將其壓縮。

壓縮後的長度必須始終小於或等於原數組長度。

數組的每個元素應該是長度爲1 的字符(不是 int 整數類型)。

在完成原地修改輸入數組後,返回數組的新長度。

樣例

示例 1:
輸入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]

輸出:
返回6,輸入數組的前6個字符應該是:[“a”,“2”,“b”,“2”,“c”,“3”]

說明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。

示例 2:
輸入:
[“a”]

輸出:
返回1,輸入數組的前1個字符應該是:[“a”]

說明:
沒有任何字符串被替代。

示例 3:
輸入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]

輸出:
返回4,輸入數組的前4個字符應該是:[“a”,“b”,“1”,“2”]。

說明:
由於字符"a"不重複,所以不會被壓縮。"bbbbbbbbbbbb"被“b12”替代。
注意每個數字在數組中都有它自己的位置。

python解法

class Solution:
    def compress(self, chars: List[str]) -> int:
        i = 0
        while i < len(chars):
            num = 1
            for j, v in enumerate(chars[i+1:], i+1):
                if v == chars[i]:
                    num += 1
                elif num != 1:
                    chars[i+1:j] = str(num)
                    i += 2
                    num = 0
                    break
                else:
                    i += 1
                    num = 0
                    break
            if num > 1:
                chars[i+1:] = str(num)
                break
            elif num == 1:
                break
        return len(chars)

執行用時 : 80ms
內存消耗 : 13.8MB

題後反思:

  1. 我使用的是切片賦值的方法來進行原地壓縮字符串。
  2. break不能漏,漏了可能就會出錯。

C++語言解法

class Solution {
public:
    int compress(vector<char>& chars) {
        char str[10];
        int anchor=0, writer = 0;
        int len = chars.size();
        for(int i=0;i<len;i++)
        {
            if (i+1 == len || chars[i+1] != chars[i])
            {
                chars[writer] = chars[anchor];
                writer ++;
                if (i > anchor)
                {
                    int j = 0, num = i - anchor + 1;
                    while(num)
                    {
                        str[j++] = num % 10 + 48;
                        num /= 10;
                    }
                    for (j--;j>=0;j--)
                    {
                        chars[writer++] = str[j];
                    }
                }
                anchor = i + 1;
            }
        }
        return writer;
    }
};

執行用時 : 16ms
內存消耗 : 9.2MB

題後反思:無

文中都是我個人的理解,如有錯誤的地方歡迎下方評論告訴我,我及時更正,大家共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章