压缩字符串
题目描述
难度:中等
解决方法
- 双指针
使用双指针 i 和 j ,通过记录重复字符的长度和字符信息,实时更新数组内容。具体过程是
-
初始化指针: 使用两个指针 i 和 j 来处理数组 chars。i 表示当前需要填充的位置,j 用于遍历原始数组。
-
遍历字符数组: 从数组的起始位置开始遍历,处理每组连续重复的字符。
-
内循环统计连续重复字符数量:
-
使用 tmp 记录当前字符的索引位置,然后向后移动 j 直到遇到不同的字符或者遍历结束。
-
在内循环中,tmp 用于记录重复字符的起始索引,j 用于找到不同的字符。
-
-
统计重复字符数量并进行压缩:
-
计算重复字符的数量 count = j - tmp。
-
如果数量不为 1:
- 将重复字符的数量转换为字符串 str = String.valueOf(count)。
- 将字符数组 chars 更新:先将重复的字符写入 chars[i],然后将重复字符的数量按照字符逐个写入 chars 中的连续位置。
-
-
更新指针和数组:
- 根据压缩后的字符数量更新指针 i,以指示下一个字符的插入位置。
-
返回新数组的长度:
- 返回 i,即压缩后数组的长度。
class Solution {
public int compress(char[] chars) {
if(chars.length<=1){
return chars.length;
}
int i=0,j=0;
while(j<chars.length){
int tmp = j;
chars[i] = chars[tmp];
j++;
while(j<chars.length && chars[tmp] == chars[j]) j++;
int count = j-tmp;
String str = String.valueOf(count);
if(count!=1){
i++;
for(int k = 0;k<str.length();k++){
chars[i] = str.charAt(k);
i++;
}
}else{
i++;
}
}
return i;
}
}
- 模拟
将字符数组转换为字符串,并对连续重复字符进行压缩。它使用了额外的字符串缓冲区来构建压缩后的结果,最后将其重新写回原始数组,并返回压缩后数组的长度。具体过程是
-
初始化变量和字符缓冲区:
-
sum:用于计算连续重复字符的数量。
-
key:记录当前处理的字符。
-
sb:用于构建压缩后的字符串。
-
-
遍历字符数组并压缩:
-
从数组的第二个元素开始进行遍历。
-
对于每个字符:
- 如果当前字符与前一个字符相同,则增加 sum。
- 如果当前字符与前一个字符不同:
- 将当前字符及其重复次数(如果大于1)追加到字符串 sb 中。
- 更新 key 为当前字符,并重置 sum 为 1。
-
-
处理最后一个字符及其重复次数:
- 遍历结束后,将最后一个字符及其重复次数(如果大于1)追加到字符串 sb 中。
-
将压缩后的字符重新写入数组:
- 使用 sb 中的字符内容,逐个写入原始字符数组 chars。
-
返回压缩后数组的长度:
- 返回字符串 sb 的长度,这也是压缩后数组的长度。
class Solution {
public int compress(char[] chars) {
if(chars.length<=1){
return chars.length;
}
StringBuffer sb = new StringBuffer();
int sum=1;
char key = chars[0];
sb.append(key);
for(int i=1;i<chars.length;i++){
if(key == chars[i]){
sum++;
}else{
key = chars[i];
if(sum!=1){
sb.append(String.valueOf(sum));
}
sb.append(key);
sum = 1;
}
}
if(sum!=1){
sb.append(String.valueOf(sum));
}
for(int i=0;i<sb.length();i++){
chars[i] = sb.charAt(i);
}
return sb.length();
}
}