題目描述
給定一組字符,使用原地算法將其壓縮。
壓縮後的長度必須始終小於或等於原數組長度。
數組的每個元素應該是長度爲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
題後反思:
- 我使用的是切片賦值的方法來進行原地壓縮字符串。
- 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
題後反思:無
文中都是我個人的理解,如有錯誤的地方歡迎下方評論告訴我,我及時更正,大家共同進步