[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

题后反思:无

文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步

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