原题如下:
分析
/*
*作者@v7fgg
*执行用时 :9 ms, 在所有 Java 提交中击败了19.94%的用户
*内存消耗 :39.7 MB, 在所有 Java 提交中击败了20.00%的用户
*2020年6月1日 21:49
*/
class Solution {
public int compress(char[] chars) {
//注意此题需要在原数组改
int l=chars.length;
if(l<2){//数组长度为1的不用进行变换,变换反而会变长
return l;
}
int ans=0;
int count=1;//用于连续相同字符数量的计数
int zhizhen=0;//代表改变原数组未知的索引
for(int i=1;i<l;i++){
if(chars[i]==chars[i-1]){
count++;
}
else{//遇到前后字符不同,则要进行压缩,先插入原字符,再依次插入count所代表的数字拆分成的字符
if(count<2){//数组长度为1的不用进行变换,
char c=chars[i-1];
chars[zhizhen]=c;
zhizhen++;
ans++;
//注意每在原数组改变一个值,就要在返回值ans加1,因为我们需要的是所有重新赋值过的数组前ans个值
}
else{
char c=chars[i-1];
chars[zhizhen]=c;
zhizhen++;
ans++;
String s=count+"";
for(int j=0;j<s.length();j++){
chars[zhizhen]=s.charAt(j);
zhizhen++;
ans++;
}count=1;
}
}
if(i==l-1){//当指针走到数组最后一位的时候,无论如何也要进行转换(count==1时例外,此时直接复制字符即可)
if(count<2){
chars[zhizhen]=chars[i];
ans++;
}
else{
char c=chars[i-1];
chars[zhizhen]=c;
zhizhen++;
ans++;
String s=count+"";
for(int j=0;j<s.length();j++){
chars[zhizhen]=s.charAt(j);
zhizhen++;
ans++;
}
}
}
}return ans;
}
}