题目不仅需要返回数组长度,还需要返回改变后的数组,如果增加一个新数组会超过内存限制。需要用到双指针,两个用来指示相同字母的个数,还有一个来指示当前已改变数组的长度。
class Solution {
public int compress(char[] chars) {
int left = 0;
int count = 0;
int n = chars.length;
for(int i=0;i<n;i++){
if(i==n-1||chars[i]!=chars[i+1]){//i+1就不会超过数组范围
chars[count++] = chars[i];
int num = i-left + 1;
if(num>1){
int flag = count;
while(num>0){
chars[count++] = (char)(num % 10+'0');//需要加两个括号
num = num / 10;
}
reverse(chars,flag,count-1);//对数字进行存储需要用到反转
}
left = i + 1;
}
}
return count;
}
public void reverse(char[] chars,int left,int right ){
while(left<right){
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;//不要忘记++和--
right--;
}
}
}