题目要求
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。
代码示例
public static int compress(char[] chars) {
//先创建一个stringBuffer的对象, 用来拼接字符和数字
StringBuffer stringBuffer = new StringBuffer();
//考虑到只有一个字符的情况, 直接返回即可
if(chars.length == 1){
return 1;
}
for(int i = 0; i < chars.length-1; i++){
int count = 1;
//如果后者和前者相同 计数变量count+1
while(i < chars.length-1 && chars[i] == chars[i+1]){
i++;
count++;
}
//如果count没有+1, 说明只有一个该字符, 直接把该字符拼接上即可
if(count == 1){
stringBuffer.append(chars[i]);
}
//如果有多个就要把该字符拼接上还要把个数也拼接到尾部
else if(count > 1){
stringBuffer.append(chars[i]);
stringBuffer.append(count);
}
}
//全部判断完毕后有两种可能
//1.最后一个字符和倒数第二个字符相同, 这种情况不需要在拼接了
//2.最后一个字符和倒数第二个字符不同, 那就要再把最后一个字符拼接到尾部
if(chars[chars.length-2] != chars[chars.length-1]){
stringBuffer.append(chars[chars.length-1]);
}
//最后一步需要把拼接出来的字符串转成为字符数组, 并将字符数组中的的内容搬到原数组中
char[] tem = stringBuffer.toString().toCharArray();
for(int j = 0; j < tem.length; j++){
chars[j] = tem[j];
}
return tem.length;
}
代码演示
char[] chars = {'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'};
System.out.println(compress(chars));